Linux管道破裂,linux 进程间通行 管道(上)

int pipe(int fd[2])

管道通信为半双工通信,用于父子进程之间。

管道创建成功返回0,出错返回-1.fd[0]为读打开,fd[1]为写打开。

#include#include#include#include#include#includemain()

{

int pipe_fd[2];

pid_t pid;

char r_buf[25];

char w_buf[25];

char *p_wbuf;

int r_num;

memset(r_buf,0,sizeof(r_buf));

memset(w_buf,0,sizeof(w_buf));

p_wbuf=w_buf;

if(pipe(pipe_fd)<0)

{

printf("pipe create error\n");

return -1;

}

if((pid=fork())==0)

{

close(pipe_fd[1]);

sleep(3);

r_num=read(pipe_fd[0],r_buf,25);

printf("read num is %d the data read from the pipe is %s\n",r_num,r_buf);

close(pipe_fd[0]);

exit(0);

}

else if(pid>0)

{

close(pipe_fd[0]);

strcpy(w_buf,"parents tell to child");

if(write(pipe_fd[1],w_buf,25)!=-1)

printf("parent write over\n");

close(pipe_fd[1]);

printf("parent close fd[1] over\n");

sleep(5);

}

}

//父进程创建一个子进程,父进程发送消息,子进程接受。

#include#include#include#include#include#include#include#include#include#define exit_err(str)  do{ perror(str);exit(1);} while(0);

int ptc[2], ctp[2];

void initproc()                        //初始化,创建两个管道

{

if(-1 == pipe(ptc))

exit_err("pipe ptc");

if(-1 == pipe(ctp))

exit_err("pipe ctp");

}

void waitchild()                        //读管道ctp

{

int pid;

if (-1 == read(ctp[0], &pid, 1))

exit_err("read1");

printf("parent has reveived the information\n");

printf("print the parent_pid recieved from child %d\n",pid);

}

void waitparent()                      //读管道ptc

{

int  pid;

if (-1 == read(ptc[0], &pid, 1))

exit_err("read2");

printf("child has reveived the information\n");

printf("print the child_pid recieved from parent %d\n",pid);

}

void inforchild(int pid)                     //向管道ptc中写入子进程id

{

if (-1 == write(ptc[1],&pid, 1))

exit_err("write2");

printf("parent has informed the child\n\n");

}

void inforparent(int pid)                   //向管道cpt中写入父进程id

{

if (-1 == write(ctp[1],&pid, 1))

exit_err("write1");

printf("child has informed the parent\n\n");

}

int main(void)

{

int i = 1;

pid_t pid;

initproc();

if((pid = fork())<0)

exit_err("fork");

if (pid == 0) {

do {

waitparent();

printf("child process is going\n");

inforparent(getppid());                      //向管道cpt中写入父进程id

} while (i--);

} else {

do {

printf("parent process is going\n");

inforchild(pid);                            //向管道ptc中写入子进程id

waitchild();

}

while (i--);

}

return 0;

}

//父子进程通过管道,同步向屏幕输出语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值