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管道的关闭
- close(pipe_fd[0]);/*关闭读管道*/
- close(pipe_fd[1]);/*关闭写管道*/
6 通信图
7.代码
两个进程,如子进程向父进程发送数据。即使用子进程的fd[1]和父进程的fd[0],同时关闭子进程的fd[0]和父进程的fd[1]
- #include<sys/types.h>
- #include<unistd.h>
- #include<stdio.h>
- #include<stdlib.h>
- #include<errno.h>
- #include<memory.h>
- int main()
- {
- char *msg="I am son process!"; /*子进程发送的数据*/
- pid_t pid;
- char buf[100];/*用于读取*/
- int pi;/*创建管道时的返回值*/
- int fd[2];/*创建管道的参数*/
- memset(buf,0,sizeof(buf));/*设置buf数组全为0,需*/
- pi=pipe(fd); /*要引入#include<memory.h>*/
- if(pi<0)
- {
- perror("pipe() error!");
- exit(0);
- }
- if((pid=fork())==0)/*son process*/
- {
- close(fd[0]); /*关闭读管道*/
- if(write(fd[1],msg,20)!=-1) /*写入管道*/
- printf("son write success!\n");
- close(fd[1]); /*关闭写管道*/
- }
- else if(pid>0)/*parent process*/
- {
- close(fd[1]); /*关闭写管道*/
- sleep(2);/*休眠一下等待数据写入*/
- if(read(fd[0],buf,100)>0)/*写入管道*/
- {
- printf("Message from the pipe is:%s\n",buf);
- }
- close(fd[0]);/*关闭读管道*/
- waitpid(pid,NULL,0);/*待pid进程退出,此处pid为子进程*/
- exit(0);
- }
- else
- {
- perror("fork() error!");
- exit(0);
- }
- }
输出
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);
}
转载于:https://blog.51cto.com/1793109/595091