小编per*_*_VW的帖子

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

我的申请要求孩子,孩子执行新程序,父母写信给孩子,然后在孩子完成一些工作后从孩子那里读回来.在监视管道的读取结束时,程序仍然在等待孩子.我目前没有写回父母,所以它故意阻止.下面是代码(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);
     }
Run Code Online (Sandbox Code Playgroud)

运行此程序时,程序仍然在select语句中挂起(永远不会到达最后一个printf),但如果我添加超时信息,程序将在5秒后继续.首先,我正确使用选择吗?第二,虽然这可能不是阻塞(在某种意义上,父进程不会被内核中断,它是否仍会导致结果(进程挂起,直到某些东西准备好)?

c io fork ipc pipe

1
推荐指数
1
解决办法
668
查看次数

标签 统计

c ×1

fork ×1

io ×1

ipc ×1

pipe ×1