Chinaunix首页 | 论坛 | 博客
  • 博客访问: 456025
  • 博文数量: 113
  • 博客积分: 446
  • 博客等级: 下士
  • 技术积分: 1229
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-09 16:01
个人简介

Let's go!!!!!

文章分类

全部博文(113)

文章存档

2019年(5)

2018年(4)

2017年(9)

2016年(5)

2015年(39)

2014年(6)

2013年(28)

2012年(17)

分类: LINUX

2012-12-09 16:13:21

int pipe(int fd[2])
管道通信为半双工通信,用于父子进程之间。
管道创建成功返回0,出错返回-1.fd[0]为读打开,fd[1]为写打开。
 
#include
#include
#include
#include
#include
#include
main()
{
 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; 
}
//父子进程通过管道,同步向屏幕输出语句
阅读(710) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:linux 进程间通行 管道(下)

给主人留下些什么吧!~~