Есть ли способ временно отключить fd 2 в UNIX? - PullRequest
0 голосов
/ 07 февраля 2011

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

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

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

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

close(2);

я бы попробовал

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

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

0 голосов
/ 07 февраля 2011

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

...