Select()仍然阻止从管道读取数据

Select()仍然阻止从管道读取数据,c,io,fork,ipc,pipe,C,Io,Fork,Ipc,Pipe,我的应用程序派生一个子程序,该子程序执行一个新程序,父程序写入该程序,然后在该子程序执行某些工作后从该子程序读回。在监视管道的读取端时,程序仍在等待子级。我目前没有回信给家长,所以它会故意阻止。以下是write_to函数关闭函数中管道未使用部分的代码: pid_t leaf_proc; int rv = 0; int w_pfd[2]; int r_pfd[2]; if(pipe(w_pfd) == -1 || pipe(r_pfd) ==

我的应用程序派生一个子程序,该子程序执行一个新程序,父程序写入该程序,然后在该子程序执行某些工作后从该子程序读回。在监视管道的读取端时,程序仍在等待子级。我目前没有回信给家长,所以它会故意阻止。以下是write_to函数关闭函数中管道未使用部分的代码:

    pid_t leaf_proc;


    int rv = 0;

    int w_pfd[2];
    int r_pfd[2];   

    if(pipe(w_pfd) == -1 || pipe(r_pfd) == -1){
        printf("Failed to pipe. Goodbye.\n");
        exit(0);
    }

    if((leaf_proc = fork()) < 0){
        printf("Error: %s\n",strerror(errno));
        exit(0);
    }else if(leaf_proc == 0){
        /***Child to be execl()'d***/
        rv = execl("Some program");
        if(rv < 0){
            printf("Error: %s\n",strerror(errno));
            exit(0);
        }
    }else{
        /***Parent***/
        write_to(par_info,w_pfd);
        fd_set read_set;
        //struct timeval tv;
        //tv.tv_sec = 5;
        //tv.tv_usec = 0;

        FD_ZERO(&read_set);
        FD_SET(r_pfd[0], &read_set);
        rv = select(r_pfd[0]+1,&read_set,NULL,NULL,&tv);
        printf("set?: %d\n",rv);
     }

当运行此命令时,程序仍然挂起在select语句处,最后一次printf从未到达,但是如果我添加超时信息,程序将在5秒后继续。首先,我是否正确使用select?第二,虽然这在某种意义上可能不是阻塞,即父进程不会被内核中断,但它是否仍然会导致结果进程挂起,直到有东西准备就绪?

您必须关闭子进程和父进程中未使用的管道部分


终止后,管道的写入fd将在子进程中关闭,但在父进程中它仍处于打开状态,因此您的选择将耐心等待数据…

您必须在子进程和父进程中关闭管道的未使用部分


终止后,管道的写入fd将在子进程中关闭,但在父进程中它仍处于打开状态,因此您的select将耐心等待数据….

well对于一个,您需要制作&read_set的主副本,因为如果您阅读select上的手册,您将看到它修改了fd的列表。well对于一个,您需要制作&read_set的主副本,因为如果您在选择时阅读手册,您将看到它修改了FD的列表。很抱歉,不清楚,但write_to函数负责关闭管道的读取端,write_to函数在子进程中也起作用。如果select等待数据,这不是本质上的阻塞吗,只是不是将进程置于睡眠状态吗?1在子进程中没有写入。。。。2这就像睡眠,当选择块时,进程将不使用CPU。子进程execl是一个调用write\u toDO的程序。您是否关闭父进程中管道的写入端?是的,我编写了名为write\u to和read\u的函数,从该句柄关闭管道的正确端。对不起,目前还不清楚,但write_to函数负责关闭管道的读取端,子进程中的write_to函数也是如此。如果select等待数据,这不是本质上的阻塞吗,只是不是将进程置于睡眠状态吗?1在子进程中没有写入。。。。2这就像睡眠,当选择块时,进程将不使用CPU。子进程execl是一个调用write\u toDO的程序。您是否关闭父进程中管道的写入端?是的,我编写了一些函数,称为write\u to和read\u,用于关闭管道的正确端。