This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
i want unsubsribe from the list ... plz can anybody help Manav -----Original Message----- From: cygwin-owner@cygwin.com [mailto:cygwin-owner@cygwin.com] On Behalf Of Kandziora Jan Sent: Friday, July 26, 2002 4:47 PM To: 'cygwin@cygwin.com' Subject: piped stdout and O_NONBLOCK Hi all, In short: Does it work? I wanted a program to write its debug messages to a pipe, data flowing into "faucet" of "netpipes" and over a network connection. But that did not work, because faucet blocks on a connect() from the other side and meanwhile does not read any data from the pipe. So the first program blocks in writing its output after a while, even if the output stream is set to O_NONBLOCK. For testing purposes I wrote a program "blocktest": #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <sys/select.h> #include <unistd.h> int main(void) { char buffer[4096]; fd_set input_set; int read_bytes; int remaining_bytes; char *p; int written_bytes; if (fcntl(0,F_SETFL,O_NONBLOCK)<0) { perror("input stream can not be set to nonblocking mode"); exit(EXIT_FAILURE); } if (fcntl(1,F_SETFL,O_NONBLOCK)<0) { perror("output stream can not be set to nonblocking mode"); exit(EXIT_FAILURE); } FD_ZERO(&input_set); FD_SET(0,&input_set); for(;;) { // Try to read. if ((read_bytes=read(0,&buffer,sizeof(buffer)))<0) { if (errno!=EAGAIN) { perror("read failed"); exit(EXIT_FAILURE); } } else { // Nothing to read. Try to write. remaining_bytes=read_bytes; p=(char*)&buffer; while (remaining_bytes>0) { if ((written_bytes=write(1,&p,remaining_bytes))<0) { if (errno==EAGAIN) break; perror("write failed"); exit(EXIT_FAILURE); } remaining_bytes-=written_bytes; p+=written_bytes; } // Write would block. Wait for new data to read. select(1,&input_set,NULL,NULL,NULL); } } } Then I put it into a pipeline cat /dev/zero | ./blocktest | sleep 1000 With Linux this works as expected, with a "cat" using nearly all cpu time. With Cygwin, "blocktest" blocks in the write call after writing 12288 bytes, causing "cat" to block. I tested this with Cygwin-1.3.9 and 1.3.12-2. Did I miss something? Jan -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Bug reporting: http://cygwin.com/bugs.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/
Attachment:
Wipro_Disclaimer.txt
Description: Text document
-- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Bug reporting: http://cygwin.com/bugs.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |