进程间通信(ipc)_一言难尽、的博客-爱代码爱编程
为什么需要进程间通信
1).数据传输
一个进程需要将它的数据发送给另一个进程。
2).资源共享
多个进程之间共享同样的资源。
3).通知事件
一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。
4).进程控制
有些进程希望完全控制另一个进程的执行(如Debug进程),该控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。
参考进程间通信
无名管道PIPE
特点:
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
PIPE用法
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd[2];
pid_t pdata;
char readBug[128]={0};
if(pipe(fd)==-1){
printf("create pipe filled!\n");
}
pdata=fork();
if(pdata<0){
printf("create fork filled!\n");
}else if(pdata>0){
sleep(2);
printf("this is father \n");
close(fd[0]);
write(fd[1],"hello child",strlen("hello child"));
wait(NULL);
}else{
printf("thisi is child\n");
close(fd[1]);
read(fd[0],readBug,128);
printf("child:%s\n",readBug);
exit(0);
}
return 0;
}
FIFO,也称为命名管道,它是一种文件类型。
1、特点
FIFO可以在无关的进程之间交换数据,与无名管道不同。
FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中
创建命名管道FIFO
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main()
{
if(mkfifo("./file1",0600)==-1){
printf("create mkfifo filled!");
if(errno==EEXIST){
printf("mkfifo you");
}
}
return 0;
}
write写端
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
char writeBug[20]="chenhailong";
int num=0;
int fd;
int data;
fd=open("./file1",O_WRONLY);
printf("write open succeess!\n");
while(1){
data=write(fd,writeBug,strlen(writeBug));
printf("write:%d:%s\n",data,writeBug);
sleep(2);
num++;
if(num==5){
break;
}
}
close(fd);
return 0;
}
read读端
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
char readBug[20]={0};
int fd;
fd=open("./file1",O_RDONLY);
printf("open success!\n");
while(1){
int data=read(fd,readBug,20);
printf("read:%d:%s\n",data,readBug);
}
close(fd);
return 0;
}