У меня есть код, который использует popen для выполнения скрипта. Он работает нормально, но беспорядочно блокирует и получает процессор до 100%. После небольшого расследования я обнаружил, что он зависает при вызовах popen. Я поместил printf после всплывающего окна, указав дескриптор вписанный, и в этом случае, когда он блокирует этот printf, он никогда не отображается.
Что может вызвать блокировку popen?
Изменение: Код
FILE* pipe = popen(cpCommand, "r");
printf(....
if (pipe)
{
while (!feof(pipe))
{
if (DataReady(fileno(pipe),2500)>0)
{
if (fgets(output,sizeof(output),pipe) != NULL)
{
DataReady - это просто выбор. Я сделал strace после того, как он блокирует и, похоже, ничего не делает
Не ответ ;-)
Попробуйте использовать strace
для того, что он делает, и какой syscall зависает.
Выход Tterminal буферизируется по строке, поэтому убедитесь, что вы сбросили вывод с помощью fflush() или с помощью новой строки (fflush(stdout);
или printf("Debug text\n");
), чтобы убедиться, что он действительно не вызывает printf().
Запустите сценарий вручную и убедитесь, что скрипт не зависает, прежде чем заподозрить popen().
Проверьте скрипт, вызванный popen()
почему он не заканчивается.
Пока сценарий не заканчивается, popen()
блокирует, скажет: не возвращается, как было замечено.
Я сильно сомневаюсь, что это проблема C.
\n
что исключается изprintf()
после вызоваpopen()
, не так ли?