LINUX.ORG.RU

select()+pipe()=непонятки....


0

0

В общем ситуация такая. Между двумя процессами организуется связь через pipe. Родитель ждет от чилда команд через пайп с помощью select. Вызываю select на доступность чтения из пайпа и из сокета (там еще и сокет надо слушать). все успешно блокирутся. И select ждет входящих данных из сокета и/или из пайпа. Пишу в потомке в этот пайп данные. Родительский select разблокируется и определяет что в пайп поступили данные. Все данные считываются. Затем опять возвращаюсь на select. Но он больше не блокируется и всегда срабатывает на пайпе. Хотя read из пайпа дает 0, то бишь конец файла. :(

Так вот вопрос заключается в том, почему первый вызов select блокируется, а второй уже нет? Как можно заставить select блокироваться и при втором вызове?

И вобще... Оно так должно быть , или я что-то путаю.

Подскажите.

★★★★

Кажется вопрос снимается, просто потомок закрыл pipe , поэтому select и не блокируется!

Dead ★★★★
() автор топика

if(setsockopt(serv_data.socket,SOL_SOCKET,SO_REUSEADDR,&amp;yes,sizeof(int)) == -1) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(buf,"Can't setsockopt: %s",strerror(errno));<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write_log(buf);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br> &nbsp;&nbsp;&nbsp; }<br> &nbsp;&nbsp; &nbsp;<br> &nbsp;&nbsp; &nbsp;<br> &nbsp;&nbsp;&nbsp; bzero(&amp;addr,sizeof(addr));<br> &nbsp;&nbsp;&nbsp; addr.sin_family = AF_INET;<br> &nbsp;&nbsp;&nbsp; addr.sin_port = htons(COMMAND_PORT);<br> &nbsp;&nbsp;&nbsp; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);<br> &nbsp;&nbsp;&nbsp; if(bind(serv_data.socket, (struct sockaddr *)&amp;addr, sizeof(addr)) != 0){<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(buf,"Can't bind socket: %s\n",strerror(errno));<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write_log(buf);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop_all();<br> &nbsp;&nbsp;&nbsp; }<br> &nbsp;&nbsp;&nbsp; if(listen(serv_data.socket, MAX_CLIENTS) != 0){<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(buf,"Can't listen port: %s\n",strerror(errno));<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write_log(buf);<br> &nbsp;&nbsp; &nbsp;return;<br> &nbsp;&nbsp;&nbsp; }

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