Interrupted system call
Доброе утро, уважаемые! Имею вот такой хитрый кусочек кода: --- cut here --- static char exec_buf[255]; static char* exec_pointer; char* exec_pipe(char* cmd) { FILE* pinput; pinput = popen(cmd,"r"); if (pinput == NULL) { radlog(L_ERR,"POPEN: Can not open %s: %s\n",cmd,strerror(errno)); return (NULL); } exec_pointer = fgets(exec_buf,255,pinput); if (exec_pointer == NULL) { radlog(L_ERR,"POPEN: fgets() returns NULL: errno = %s\n",strerror(errno)); pclose(pinput); return (NULL); } pclose(pinput); return(exec_pointer); } --- cut here --- Что он делает, я думаю, всем понятно. Но тут возникает ситуация, когда fgets возвращает таки NULL и strerror(errno) отдает "Interrupted system call". Это у меня внешний скрипт в кору падает или я что-то не так делаю? Подскажите, пожалуйста. -- Alex Radetsky AR2657-RIPE RAD-UANIC =================================================================== uanog mailing list. To Unsubscribe: send mail to majordomo@uanog.kiev.ua with "unsubscribe uanog" in the body of the message
Tue, Apr 06, 2004 at 09:54:29, rad wrote about "[uanog] Interrupted system call":
Но тут возникает ситуация, когда fgets возвращает таки NULL и strerror(errno) отдает "Interrupted system call".
Это у меня внешний скрипт в кору падает или я что-то не так делаю?
Это тебе сигнал послали. После такого можешь сделать clearerr() и повторить fgets(). P.S. может, в ru.unix.prog? -netch- =================================================================== uanog mailing list. To Unsubscribe: send mail to majordomo@uanog.kiev.ua with "unsubscribe uanog" in the body of the message
Hi! On Tue, Apr 06, 2004 at 09:54 +0300, Alex Radetsky wrote:
exec_pointer = fgets(exec_buf,255,pinput); if (exec_pointer == NULL) { radlog(L_ERR,"POPEN: fgets() returns NULL: errno = %s\n",strerror(errno)); pclose(pinput); return (NULL);
Что он делает, я думаю, всем понятно.
Но тут возникает ситуация, когда fgets возвращает таки NULL и strerror(errno) отдает "Interrupted system call".
Это у меня внешний скрипт в кору падает или я что-то не так делаю?
Зависит от остальных частей кода. Например прилетевший ALARM, влолне повод для "Interrupted system call", и попытку чтения из pipe/socket-а имеет смысл повторить (правда, вопрос еще в том что будет с буфером у fgets-а, если оно уже часть строки достало себе в буфер - а потом случился EINTR... но эту проблему можно обойти если fgets-ом не пользоваться ;) =================================================================== uanog mailing list. To Unsubscribe: send mail to majordomo@uanog.kiev.ua with "unsubscribe uanog" in the body of the message
On Tue, Apr 06, 2004 at 10:08:23AM +0300, Andrey Blochintsev wrote:
exec_pointer = fgets(exec_buf,255,pinput); if (exec_pointer == NULL) { radlog(L_ERR,"POPEN: fgets() returns NULL: errno = %s\n",strerror(errno)); pclose(pinput); return (NULL);
Что он делает, я думаю, всем понятно. Но тут возникает ситуация, когда fgets возвращает таки NULL и strerror(errno) отдает "Interrupted system call". Это у меня внешний скрипт в кору падает или я что-то не так делаю?
Зависит от остальных частей кода. Например прилетевший ALARM, влолне повод для "Interrupted system call", и попытку чтения из pipe/socket-а имеет смысл повторить (правда, вопрос еще в том что будет с буфером у fgets-а, если оно уже часть строки достало себе в буфер - а потом случился EINTR... но эту проблему можно обойти если fgets-ом не пользоваться ;)
Чем же можно заменить в данном случае fgets()? Написать чего-нибудь самому на низком уровне? Или через fgetc()? В мане ясно сказано, что смешивать read() && fgetX() не стоит. -- Alex Radetsky AR2657-RIPE RAD-UANIC =================================================================== uanog mailing list. To Unsubscribe: send mail to majordomo@uanog.kiev.ua with "unsubscribe uanog" in the body of the message
Tue, Apr 06, 2004 at 10:17:13, rad wrote about "[uanog] Re: Interrupted system call":
Зависит от остальных частей кода. Например прилетевший ALARM, влолне повод для "Interrupted system call", и попытку чтения из pipe/socket-а имеет смысл повторить (правда, вопрос еще в том что будет с буфером у fgets-а, если оно уже часть строки достало себе в буфер - а потом случился EINTR... но эту проблему можно обойти если fgets-ом не пользоваться ;) По-моему, для него обещано выдавать ту часть строки, что он успел получить.
Чем же можно заменить в данном случае fgets()? Написать чего-нибудь самому на низком уровне? Или через fgetc()? В мане ясно сказано, что смешивать read() && fgetX() не стоит.
Наверно, таки цикл getc(), или можешь повторить fgets() на остатке буфера. -netch- =================================================================== uanog mailing list. To Unsubscribe: send mail to majordomo@uanog.kiev.ua with "unsubscribe uanog" in the body of the message
On Tue, Apr 06, 2004 at 11:46:26AM +0300, Valentin Nechayev wrote:
Зависит от остальных частей кода. Например прилетевший ALARM, влолне повод для "Interrupted system call", и попытку чтения из pipe/socket-а имеет смысл повторить (правда, вопрос еще в том что будет с буфером у fgets-а, если оно уже часть строки достало себе в буфер - а потом случился EINTR... но эту проблему можно обойти если fgets-ом не пользоваться ;) По-моему, для него обещано выдавать ту часть строки, что он успел получить.
Чем же можно заменить в данном случае fgets()? Написать чего-нибудь самому на низком уровне? Или через fgetc()? В мане ясно сказано, что смешивать read() && fgetX() не стоит.
Наверно, таки цикл getc(), или можешь повторить fgets() на остатке буфера.
Повтор fgets() в большинстве случаев спасает. Остальное не столь критично. Так что теперь буду в спокойном режиме изучать логи и работать над исправлением ошибок. Всем большое СПАСИБО! :) -- Alex Radetsky AR2657-RIPE RAD-UANIC =================================================================== uanog mailing list. To Unsubscribe: send mail to majordomo@uanog.kiev.ua with "unsubscribe uanog" in the body of the message
participants (3)
-
Alex Radetsky
-
Andrey Blochintsev
-
Valentin Nechayev