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

  1. return -1 on error
  2. return 0 if timeout occurs
  3. 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

Popular posts from this blog

routing - AngularJS State management ->load multiple states in one page -

python - GRASS parser() error -

Swift game error message -