linux终端下使用pipe实现父子进程交互

linux终端下使用pipe实现父子进程交互,第1张

看这个问题好久都没人回答。。。

挺简单的,fork一子一父进程,父进程循环读入文件内容,并写进道管道里面,子进程循环从管道接收然后打印出来。

撸码辛苦,望采纳。

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <string.h>

#include <fcntl.h>

int  main()

{

pid_t result

int n,num

int pipe_fd[2]

int fd

char buf1[100],buf2[100]

memset(buf1,0,sizeof(buf1))

memset(buf2,0,sizeof(buf2))

fd = open("/home/w.c",O_RDONLY)

if(pipe(pipe_fd)<0)

{

printf("error!\n")

return -1

}

result=fork()

if(result<0)

{

printf("error!\n")

exit(0)

}

else if(result==0)

{

close(pipe_fd[1])

while((n =read(pipe_fd[0],buf1,99))>0)

{

buf1[n] = '\0'

printf("%s",buf1)

memset(buf1,0,sizeof(buf1))

}

}

else

{

close(pipe_fd[0])

while((num = read(fd,buf2,99)) >0){

write(pipe_fd[1],buf2,strlen(buf2))

}

waitpid(result,NULL,0)

}

close(pipe_fd[1])

close(pipe_fd[0])

close(fd)

return 0

}

代码没有问题,主要是while直接printf,时间太短,打屏输出速度跟不上,你看不到父进程输出,下面我修改了一下,增加了sleep,可以看到效果。

#include<stdio.h>

#include<unistd.h>

#include<sys/wait.h>

using namespace std

int main(int argc, char *argv[])

{

    int pid

    pid = fork()

    if(pid == 0)

    {//子进程

        while(1)

        {

            printf("child\n")

            sleep(1)

        }

    }

    else

    {//父进程

        while(1)

        {

            printf("parent\n")

            sleep(1)

        }

    }

    return 0

}输出结果:

parent

child

parent

child

parent

child

希望能帮助到你,你的好评是我前进的动力!谢谢!

这个不确定,但通常内核

让子

进程先执行,因为很多时候在创建一个

子进程

后紧接着就调用exec

系统调用

。内核的这些代码我没什么印象了,估计就相当于用了gnu

c的likely、unlikely之类的优化。你不信多试几次,会发现它的确是不能确定的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7647225.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存