если успелось прочитаться что-то то вернется то что успелось прочитаться, если вообще ничего не успел прочитать то вернется NULL
кстати помоему fgets вывалится только в том случае если read вернет <= 0, а это не обязательно произойдет при сигнале, т/к read может успеть прочитать немного
>> если успелось прочитаться что-то то вернется то что успелось прочитаться, если вообще ничего не
успел прочитать то вернется NULL
> А ты уверен?
нет :), Но это ведь легко проверить
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
FILE *fp1, *fp2;
void
mysh(int s)
{
fputs("done\n", fp2);
printf("%s\n", __FUNCTION__);
}
int
main()
{
char str[1024+1];
char *p;
int fds[2];
if (pipe(fds))
return -1;
fp1 = fdopen(fds[0], "r");
fp2 = fdopen(fds[1], "w");
if (fp1 == NULL || fp2 == NULL)
return -2;
setbuf(fp1, NULL);
setbuf(fp2, NULL);
fputs("test .. ", fp2);
signal(SIGALRM, mysh);
alarm(1);
printf("reading ..\n");
p = fgets(str, 1024, fp1);
printf("p=%p\n", p);
if (p)
printf("str='%s'\n", str);
return 0;
}
$ gcc -Wall -o ft ft.c
$ ./ft
reading ..
mysh
p=0xbfbff4fc
str='test .. done
'
строка прочиталась полностью
> Есть мнение (не авторитетное), что стримы из stdio в Линухе сами заботятся об EINTR...
хмм, может быть
>> ...read вызванный fgets перебивается именно SIGCHLD
>Конечно read() перебьется SIGCHLDом. Но fgets его рестартует.
Если fgets его рестартует то откудова мне знать что возникла ситуация EINTR??? А я там везде записываю (write(2,); send(4,)) О том что fgets вместо рестарта read вернул мне NULL & EINTR.
Повторяю ещё раз read(тоесть fgets) перестартовую _я_ и притом вручную !!!
Кстати я бы сильно обрадовался если б заставил fgets перестартовывать read(). Может чё подскажите???
cvv
А обработчик как у тебя на сигчилд поставлен ?
Может быть ты флагами указал что не надо рестартить
сисколы после сигнала ? Вот они у тебя и не рестартятся...