LINUX.ORG.RU

Как так может быть? popen


0

0

Код:
...

		gchar *start_str = "/usr/bin/perl -I%s -x%s %s/start",
					buf[512];
		g_sprintf(buf,start_str,options.path,options.path,options.path);
		g_printf("str: %s \n",buf);
		thread.stream = popen(buf,"r");
		g_printf("file: %d \n",(gint)thread.stream);
		if(thread.stream != NULL){
			g_printf("Stream start ok! Run thread and wait data...\n");

...


Запускаю в консоли пишет:

[user@home src]$ ./utc_gui
str: /usr/bin/perl -I/media/flash -x/media/flash /media/flash/start
Can't open perl script "/media/flash/start": Нет такого файла или каталога
file: 143148136
Stream start ok! Run thread and wait data...


То есть действительно файла start нет в папке /media/flash! И вывод в консоли об этом правильно говорит. Но почему же после этого ф-ия popen возвращает дискриптор потока 143148136??? И естествено не проходит проверка if(thread.stream != NULL)

В man popen написано в случае ошибки возвращает NULL. Или как понять что произошла ошибка?
anonymous


Ну блин... popen делает вначале fork, после чего child-процесс
делает exec (упрощенно).

Таким образом popen() может вернуть ошибку только в том случае,
если она произошла в текущем, родительском процессе. Ошибку,
случившуюся в child-процессе (при exec внешнего файла) popen
естественно вернуть не может.
Поэтому надо _обязательно_ использовать pclose - она вернет
статус завершения child-процесса.

Если бы ты не поленился, а набрал 'info popen' то получил бы
пример его использования.

HTH

Onanim
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.