1.进程通信

Linux的进程都是从父进程中派生出来的,会复制父进程的某些资源空间,但是两者的数据空间是分离的,因此进程间通信需要一些方法。进程通信的目的是:数据传输,共享数据,通知时间,资源共享(需要锁和同步机制),进程控制等。

2.管道通信

 主要用于 不同进程间的通信。Linux运行的重定向就是使用了管道。

管道是单向的,先进先出的,固定大小的字节流,将A进程的标准输出和B进程的标准输入连接在一起,以实现进程通信。

写进程A在管道尾端写入数据,读进程B在管道首端读取数据,当某进程试图读取一个“空管道”时,将一直处于阻塞状态,直到有数据进入管道。

3.所需头文件

 #include<unistd.h>
 #include<errno.h>

4.原函数

int pipe(int fd[2]);

函数传入值 fd[2]:管道的两个文件描述符,fd[0]用于读取管道,fd[1]用于写入管道

返回值 成功 0 失败 -1

5管道的关闭

 

 
  
  1. close(pipe_fd[0]);/*关闭读管道*/ 
  2.  
  3. close(pipe_fd[1]);/*关闭写管道*/ 

6 通信图

 

 

7.代码

两个进程,如子进程向父进程发送数据。即使用子进程的fd[1]和父进程的fd[0],同时关闭子进程的fd[0]和父进程的fd[1]

 

 
  
  1. #include<sys/types.h> 
  2. #include<unistd.h> 
  3. #include<stdio.h> 
  4. #include<stdlib.h> 
  5. #include<errno.h> 
  6. #include<memory.h> 
  7.  
  8. int main() 
  9.   char *msg="I am son process!"/*子进程发送的数据*/ 
  10.   pid_t pid;  
  11.   char buf[100];/*用于读取*/ 
  12.   int pi;/*创建管道时的返回值*/ 
  13.   int fd[2];/*创建管道的参数*/ 
  14.  
  15.   memset(buf,0,sizeof(buf));/*设置buf数组全为0,需*/ 
  16.   pi=pipe(fd);          /*要引入#include<memory.h>*/ 
  17.    
  18.   if(pi<0) 
  19.   { 
  20.     perror("pipe() error!"); 
  21.     exit(0); 
  22.   } 
  23.    
  24.   if((pid=fork())==0)/*son process*/ 
  25.   { 
  26.    close(fd[0]);  /*关闭读管道*/ 
  27.    if(write(fd[1],msg,20)!=-1)  /*写入管道*/ 
  28.        printf("son write success!\n"); 
  29.    close(fd[1]);  /*关闭写管道*/ 
  30.    } 
  31.   else if(pid>0)/*parent process*/ 
  32.   { 
  33.    close(fd[1]); /*关闭写管道*/ 
  34.    sleep(2);/*休眠一下等待数据写入*/ 
  35.    if(read(fd[0],buf,100)>0)/*写入管道*/ 
  36.      { 
  37.          printf("Message from the pipe is:%s\n",buf); 
  38.      } 
  39.    close(fd[0]);/*关闭读管道*/ 
  40.     waitpid(pid,NULL,0);/*待pid进程退出,此处pid为子进程*/ 
  41.    exit(0); 
  42.   } 
  43.   else 
  44.   { 
  45.     perror("fork() error!"); 
  46.     exit(0); 
  47.   } 
  48.  
  49.     
  50.    

输出

son write success!
Message from the pipe is:I am son process!
 

总结:

写入管道:

 write(pipe_fd[1],"data",size);

 if(write(fd[1],msg,20)!=-1)
       printf("son write success!\n");

读取:

 int num=read(pipe_fd[0],buf,size)

  if(read(fd[0],buf,100)>0)
     {
         printf("Message from the pipe is:%s\n",buf);
     }