Использовать fclose для pipe of popen - это серьезная ошибка?
Несколько месяцев назад я пишу CGI-приложение для Linux, которое использует popen()
читать вывод команды, а затем я закрываю канал с fclose()
,
Теперь я прочитал, что для закрытия труб необходимо использовать pclose()
,
В руководстве сказано:
Возвращаемое значение из
popen()
является нормальным стандартным потоком ввода-вывода во всех отношениях, за исключением того, что он должен быть закрытpclose()
скорее, чемfclose(3)
,
Мой код такой:
if ((NULL != (f = popen(command.value, "r")))) {
//do something
fclose(f);
}
Мой вопрос:
Моя ошибка связана с безопасностью? Эта программа в настоящее время находится в производстве. В тестах это не делает ничего проблемного. Это действительно необходимо, исправьте это с помощью pclose()
вместо fclose()
? Примечание: я открываю ТРУБУ только один раз в программе.
Сегодня в моем местном доме я делаю некоторые тесты и fclose()
а также pclose()
не возвращать EOF, указывая на ошибку.
3 ответа
Если вы используете fclose для канала, у вас будут утечки файлового дескриптора, так как fclose не освободит указатель файла в ядре (которое создается при создании канала, поскольку это файл).
Хотя до сих пор тестирование не показало никаких проблем, запустите вашу программу 3000 раз (или сколько файловых дескрипторов разрешено, вплоть до int, я думаю) и посмотрите, когда вы больше не сможете создавать каналы.
Согласно этой теме, используя fclose
вместо pclose
означает, что процесс на другом конце канала не получает результатов, поэтому он остается в зомби.
Я только что узнал (через 10 лет), что я по ошибке использовал fclose
для некоторых popen
звонки, работающие на сервере windows 2008. Это сработало (то есть не сработало), и мне все равно не нужен код возврата для этих вызовов.
Но мне нужен был код возврата последнего popen
поток и закрыть было сделано правильно с pclose
,
Это имеет странный эффект возврата кода ошибки 0 (возможно, сбор кода возврата ранее не pclosed
процесс), даже если команда не удалась, создавая очень странную ошибку в коде, которая могла привести к катастрофическим ошибкам, потому что вызывающая сторона считает, что команда сработала.
Так что это не только утечка дескрипторов, это может привести к функциональным ошибкам в вашем коде (даже если приложение работает в течение нескольких секунд, и вам не нужны утечки дескрипторов)