Несколько месяцев назад я пишу приложение CGI для Linux, которое использует popen()
для чтения вывода команды, а затем я закрываю трубку с помощью fclose()
.Использование fclose для трубы попена является серьезной ошибкой?
Теперь я читал, что для закрытых труб необходимо использовать pclose()
.
Руководство говорит:
Возвращаемое значение
popen()
нормальный поток стандартный I/O во всех отношениях кроме того, что она должна быть закрыта сpclose()
, а неfclose(3)
.
Мой код выглядит так:
if ((NULL != (f = popen(command.value, "r")))) {
//do something
fclose(f);
}
Мой вопрос:
Моя ошибка есть проблемы безопасности? Эта программа в настоящее время находится в производстве. В тестах это ничего не делает. Действительно необходимо, исправить его, используя pclose()
вместо fclose()
? Примечание. Я только открываю PIPE один раз в программе.
Сегодня, в моем местном доме, я делаю некоторые испытания и fclose()
и pclose()
не возвращает EOF, указывающий сбой.
Вы Неопределенное поведение : Прочитайте ['pclose()' vs 'fclose()'?] (Http://cboard.cprogramming.com/cplusplus-programming/97147-pclose-vs-fclose.html): Функция '_pclose' просматривает ИД процесса командного процессора (CMD.EXE), запущенный связанным вызовом '_popen', выполняет вызов' _cwait' в новом командном процессоре и закрывает поток на связанном канале. ' –
. Есть несколько сообщений SO, связанных с вашим вопросом: 1. [' fclose ()/pclose() 'может блокировать некоторые указатели на файлы] (http://stackoverflow.com/questions/1736983/fclose-pclose-may-block-on-some-file-pointers) и [Как закрыть дескриптор трубы в unix ? '(fclose() of pclose())'?] (http://stackoverflow.com/questions/5548364/how-close-pipe-handle-in-unix-fclose-of-pclose) –
спасибо, я исправлю потому что это действительно важно. Теперь я смотрю на удар. – carlos