LINUX.ORG.RU

помогите с select/pipe, плииииз...


0

0

Вот такая прога не работает. Здесь оба потока создаются нормально, один начинает писать в свой файл, сообщая каждую секунду write OK. Однако второй поток вообще ничего не сообщает, вызов select подвисает. Подскажите, плиз, в чем тут дело.

int mypipe[2];

void * start1(void*p) { int i; char buf[1]; int err; for(i=0;i<10;++i) { sleep(1); buf[0] = (char)i; if(write(mypipe[1], buf, 1) < 0) { perror("thread1: write error:"); break; } } return NULL; }

void * start2(void*p) { int i; int err; char buf[1]; fd_set s; for(i = 0; i < 15; ++i) { FD_ZERO(&s); FD_SET(mypipe[0], &s); if((err=select(1, &s, NULL, NULL, NULL)) < 0) { perror("thread2: file descriptors select error:"); break; } else if(err == 0) printf("select timeout\n"); if(read(mypipe[0], buf, 1) < 0) { perror("thread2: read error:"); break; } else printf("data received: %d\n", buf[0]); } return NULL; }

int main() { pthread_t th1, th2; int err; if((err = pipe(mypipe)) != 0) { perror("error creating pipe: "); return 1; } pthread_create(&th2, NULL, start2, NULL); pthread_create(&th1, NULL, start1, NULL); return 0; }

Re: помогите с select/pipe, плииииз...

Бага в селекте видна невооруженным (после ident'а). Первый парамерт должен быть mypipe[0] + 1

anonymous ()

помогите с select/pipe, плииииз...

О, спасибо! А я думал, что "+1" - имеется ввиду максимальное количество дескрипторов в fd_set.

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