℡奉 承 2022-04-20 18:34 采纳率: 33.3%
浏览 17
已结题

过管道将父进程的标准输出作为子进程的标准输入,在子进程中使用输入函数,出现阻塞现象

我试图通过管道将父进程的标准输出作为子进程的标准输入,但是子进程并不能通过管道读取到数据?
代码:
int main(void)
{
int fd[2];
pid_t pid;

    if(pipe(fd) < 0) //创建管道
    {
            perror("pipe error");
            exit(-1);
    }

    if((pid = fork()) < 0)// 创建子进程
    {
            exit(-1);
    }
    else if(pid == 0)
    {
            //puts("child start");
            char buf[100] = {0};

            close(fd[1]);
            dup2(fd[0], 0);//将管道的读端,作为标准输入
            close(fd[0]);
        
            gets(buf);//从标准输入中读取数据,存放在buf,相当于从fd[0]读数据存放在buf中
            puts(buf);//打印读取的数据
            //puts("child end");
    }
    else
    {
            //puts("parent start");
            close(fd[0]);
            write(fd[1], "123", 4);//往管道的写端,写入数据
            wait(NULL);
    }

    return 0;

}

运行结果阻塞!在子进程gets(buf)处!有人知道这个问题吗?如果将注释的puts函数取消注释,则正常输出,感觉和缓冲区有关系。。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月28日
    • 创建了问题 4月20日

    悬赏问题

    • ¥15 2020长安杯与连接网探
    • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
    • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
    • ¥16 mybatis的代理对象无法通过@Autowired装填
    • ¥15 可见光定位matlab仿真
    • ¥15 arduino 四自由度机械臂
    • ¥15 wordpress 产品图片 GIF 没法显示
    • ¥15 求三国群英传pl国战时间的修改方法
    • ¥15 matlab代码代写,需写出详细代码,代价私
    • ¥15 ROS系统搭建请教(跨境电商用途)