1.进程间通信的目的:
1.数据传输 2.共享数据 3.通知事件 4.资源共享 5.进程控制
2.进程间通信的方法:
1.管道(Pipe)和有名管道(FIFO)
2.信号(Signal)
3.消息队列
4.共享内存(Shared Memory)
5.信号量(Semaphore)
6.套接字(Socket)
(1)管道通信:管道是半双工的,数据只能向一个方向流动,需要双方通信时需要建立两个管道。
只能用在具有亲缘关系的进程之间(有名管道不受限制)。
单独构成一种独立的文件系统。
数据的写入和读出:一个进程向管道的一端写入内容,被另一个进程在管道的另外一端读出。写入的内容每次都 添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
pipe(); 函数用来建立无名管道。
下面是父子进程双向通信的示例代码,需要注意的是要创建两个管道。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
int main()
{
pid_t pid;
int i;
int fd[2];
char buf[100];
//一定要在创建子进程之前创建管道,否则子进程也会创建不需要的管道。
if(pipe(fd) < 0)
{
printf("pipe error\n");
exit(0);
}
printf("fd[0] = %d, fd[1] = %d \n", fd[0], fd[1]);
pid = fork(); //创建子进程
if(pid < 0)
{
printf("FORK ERROR\n");
exit(1);
}
else if(pid > 0) //父进程
{
close (fd[0]); //关闭读取端
char s[] = {"hello . . . \n"};
write(fd[1], s, sizeof(s));
sleep(1);
close (fd[1]); //关闭写入端
wait(NULL);
}
else //子进程
{
close (fd[1]);
read(fd[0], buf, sizeof(buf));
printf("I am a child!\n");
printf("%s", buf);
close (fd[0]);
exit(0);
}
return 0;
}