Linux C select() 永远不会返回 0

问题描述 投票:0回答:1

我对选择和管道有疑问。我正在尝试创建 3 个子进程,每个子进程都有一个管道将消息发送到父进程。我正在使用

select()
检查是否有任何 fd 准备好。我的问题是我总是从
select()
得到非零返回值,所以我的循环不会终止。有人可以帮我弄这个吗?谢谢。

 int pps[3][3];                                 //pipes
 int highestFD=-1;
 fd_set read_set;
 for (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);
    for (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 {
        for (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);
            }
        }
     }
 }
c pipe posix-select
1个回答
1
投票

来自

select()

的手册页
RETURN VALUE
   On success, select() and pselect() return the number of  file  descrip‐
   tors  contained  in  the  three  returned descriptor sets (that is, the
   total number of bits that are  set  in  readfds,  writefds,  exceptfds)
   which  may  be  zero if the timeout expires before anything interesting
   happens.  On error, -1 is returned, and errno is set appropriately; the
   sets  and  timeout  become  undefined, so do not rely on their contents
   after an error.

注意此声明:

“返回三个返回的描述符集中包含的文件描述符的数量”

其中(以及手册页的其余部分)说

  1. 出错时返回-1
  2. 超时返回0
  3. 当任何关联的文件系统有任何数据移动要报告时,返回>0

因此,要返回零,关联的 fd 都不能输入任何数据,并且不会发生 I/O 错误。

那么为什么代码中的

select()
永远不会返回 0?

答案:因为只有发生超时时才能返回0,而发布的代码从未设置超时。

© www.soinside.com 2019 - 2024. All rights reserved.