linux C select() never return 0 -
have question select , pipe. i'm trying create 3 child processes , each has pipe send message parent process. i'm using select() check if there fd ready. question non-zero return value select() loop won't terminate. can me this? thanks.
int pps[3][3]; //pipes int highestfd=-1; fd_set read_set; (i = 0;i<3;i++) { if(pipe(pps[i]) != 0) { exit(1); } int ret= fork(); if (ret== 0) { close(stdout_fileno); close(pps[i][0]); dup2(pps[i][1], 1); write(1, "something", 100); exit(0); //child process exit } if (ret > 0) { close(pps[i][1]); if (pps[i][0] > highestfd) highestfd = pps[i][0]; } } while(1) { fd_zero(&read_set); (i = 0;i<3;i++) { fd_set(pps[i][0], &read_set); } changedcount = 0; changedcount = select(highestfd+1, &read_set, null, null, null); if (changedcount <= 0) { printf("exit"); break; } else { (i = 0;i<3;i++) { if (fd_isset(pps[i][0], &read_set)) { int rc = read(pipes[i][0], buffer, 100); if (rc > 0) { printf("%s\n",buffer); memset(buffer, 0, 100); } } } }
from man page select()
return value on success, select() , pselect() return number of file descrip‐ tors contained in 3 returned descriptor sets (that is, total number of bits set in readfds, writefds, exceptfds) may 0 if timeout expires before interesting happens. on error, -1 returned, , errno set appropriately; sets , timeout become undefined, not rely on contents after error. notice statement:
"return number of file descriptors contained in 3 returned descriptor sets"
which (along rest of man page) says
- return -1 on error
- return 0 if timeout occurs
- return >0 when of associated fs's have data movement report
so, return zero, none of associated fd's can have input data , i/o error did not occur.
so why 0 never returned select() in code?
answer: because 0 can returned when timeout occurs , posted code never setup timeout.
Comments
Post a Comment