吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1029|回复: 2
收起左侧

[求助] 通过管道将父进程的标准输出作为子进程的标准输入

[复制链接]
ZheCi 发表于 2022-4-20 18:25
我试图通过管道将父进程的标准输出作为子进程的标准输入,但是子进程并不能通过管道读取到数据?
代码:
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)处!有前辈直到这个问题吗?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

A学习的小菜鸟 发表于 2022-4-24 10:48
你遇到进程的死锁了,具体一点就是看看进行管理原理,你也就明白了,简单点就是代码虽然是逻辑运行,但是进程在系统中不是按照顺序进行运行的,所以出现一个进程同时抢夺资源,或者同时想让资源的情况,建议加上信号量试试
 楼主| ZheCi 发表于 2022-5-13 10:15
A学习的小菜鸟 发表于 2022-4-24 10:48
你遇到进程的死锁了,具体一点就是看看进行管理原理,你也就明白了,简单点就是代码虽然是逻辑运行,但是进 ...

是gets的问题,gets需要接受'\n'才能正常返回!将write(fd[1], "123", 4);语句换成write(fd[1], "123\n", 4);可正常解决!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 12:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表