2011-02-07 3 views
0

Я написал приложение, которое использует fork и execv для запуска другого процесса. Я сделал трубку для уведомления о статусе, и из основной записи запущенного процесса я пишу несколько байтов, чтобы сообщить, что он запущен правильно. В противном случае, чтение возвращает 0, поскольку канал записи был закрыт в разветвленном процессе.Есть ли способ временно отключить fd 2 в UNIX?

Единственная проблема в том, что процесс не запускается (отсутствует библиотека), я получаю сообщение в stderr об этом. Сообщение написано для оболочки, что не так. Я бы предпочел сделать это тихо. Однако, если я закрываю (2) перед execv, у меня нет сообщения о том, чего я хочу. Тем не менее я хотел бы оставить fd 2 открытым для stderr.

ответ

1

Предположительно, приложение не любит не иметь потока stderr вообще. Вместо

close(2); 

Я хотел бы попробовать

int tmpfd = open("/dev/null", O_WRONLY); 
dup2(tmpfd, 2); 
close(tmpfd); 

Конечно вы приглашаетесь добавить обработку ошибок.

+0

Или 'dup (1, 2)', если родительский процесс хочет увидеть сообщение об ошибке. –

0

Благодарим вас обоих. Я решил проблему с перенаправлением stderr на/dev/null. Однако я должен запустить дочерний процесс два раза. Сначала я проверяю, запускает ли он вообще с подавленным stderr, а затем я запускаю его снова, если первый раз был успешным. Поэтому у меня есть правильный stderr по умолчанию для дочернего процесса и без вывода оболочки в случае сбоя.