Использовать 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 процесс), даже если команда не удалась, создавая очень странную ошибку в коде, которая могла привести к катастрофическим ошибкам, потому что вызывающая сторона считает, что команда сработала.

Так что это не только утечка дескрипторов, это может привести к функциональным ошибкам в вашем коде (даже если приложение работает в течение нескольких секунд, и вам не нужны утечки дескрипторов)

Другие вопросы по тегам