2016-10-06 3 views
0

Я пишу одну задачу, которая вмещает одну другую программу printf(). Она разворачивает один дочерний процесс и перенаправляет все выходные данные программы на дочерний процесс. Код ниже - это то, что я написал, который еще не запущен, и мне нужно добавить эту функцию на нем, я думаю.Как развить дочерний процесс и перенаправить все выходные данные программы на дочерний процесс?

int printf(char* format, ...) 
{ 
    int res; 
    static void *(*mallocp)(size_t size); 
    char *error; 
    if (!mallocp) { 
    mallocp = dlsym(RTLD_NEXT, "printf"); 
     if ((error = dlerror()) != NULL) { 
      fputs(error, stderr); 
      exit(1); 
     } 
    } 
    va_list args; 
    va_start(args, format); 
    res=mallocp(format, args); 
    va_end(args); 
    return res; 
} 

Я нахожу одно подобное решение, но немного другое. Redirect stdin and stdout in child in c Я действительно не знаю, после того как я разработал один дочерний процесс и хорошо сконфигурировал канал, как я могу позволить родителям обрабатывать систему «printf» mallocp, чтобы дать stdout, который должен быть перенаправлен на дочерний процесс. (может быть что-то вроде system("./calc/calc "); в этом примере) Я новичок в этом поле. Не могли бы вы мне сказать ?

BTW, я не знаю, пропустил ли я понимание реализации всего процесса, потому что это один вопрос, и я не знаю официального решения.

+0

Что такое _actual problem_ вы пытаетесь решить этот путь? –

ответ

0

Используйте «dup2» и замените «stdout» на дескриптор файла «pipe».

Я предполагаю, что ваша труба хорошо настроена от родителя к ребенку.

Тогда ребенок может читать с другого конца.

dup2 (fd, 1); // 1 для стандартного вывода

Второго варианта: (в случае, если ваша труба не хорошо больше)

Использования разделяемой памяти.

Создание объекта общей памяти.

Перенаправить STDOUT из родителя в общую память.

Ребенок может это видеть.

вот пример http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/example-1.html

+0

Ну, ссылка не мой код, просто похожий пример. Я думаю, что 'system ("./Calc/calc ");' какое-то место мне нужно изменить в соответствии с моим вопросом. Becaue Мне нужен родительский процесс для реализации системы 'printf', пока ребенок прослушивает stdout – shen

+0

Попробуйте использовать общий объект памяти. Обновленный ответ – Naidu