一、进程间通信方式
1、有名管道(FIFO)和管道(PIPO)。
管道:(1)单向,先进先出,把一个进程的输入和输出连接在一起。
(2)在管道的尾部写入程序,在管道的头部读出数据。
(3)数据被一个进程读取后,将从管道删除。
(4)进程阻塞情况:读空管道时,或者进程已经写满。、
*(无名)管道:父进程和子进程之间的通信 int pipe( int fieldis[2] ) ; 数组保存两个文件描述符
fieldis[0] 用于读管道 fieldis[1] 用于写管道
父进程写程序,子进程读程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void ReadData(int fd)
{
int ret;
char buf[32]={0};
while(1)
{
ret = read(fd,buf,sizeof(buf));
if(-1 == ret)
{
perror("read");
exit(1);
}
if(!strcmp(buf,"bye"))
{
break;
}
printf("read from pipe: %s\n",buf);
memset(buf, 0, sizeof(buf));
}
close(fd);
}
void WriteData(int fd)
{
int ret;
char buf[32]={0};
while(1)
{
scanf("%s",buf);
ret = write(fd,buf,strlen(buf));
if(-1 == ret)
{
perror("write");
exit(1);
}
if(!strcmp(buf,"bye"))
{
break;
}
memset(buf, 0, sizeof(buf));
}
close(fd);
}
int main()
{
int ret ,fd[2]={0};
pid_t pid;
ret = pipe(fd);
if(-1 == ret)
{
perror("pipe");
exit(1);
}
pid = fork();
if(-1 == pid)
{
perror("fork");
exit(1);
}
else if(0 == pid) //子进程
{
close(fd[1]); // 关闭写端口
ReadData(fd[0]); // fd[0]读数据
}
else //父进程
{
close(fd[0]); // 关闭读端口
int status;
WriteData(fd[1]); // fd[1]写数据
wait(&status);
}
return 0;
}
必须在使用fork()函数之前调用pipe()创建管道,否则子进程不会继承父进程的文件描述符
*有名管道:任意两个进程间的通信
写文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int ret, fd;
char buf[32] = {0}; // 管道写数据
fd = open("fifo.tmp", O_WRONLY); // 以只写方式打开
if (-1 == fd)
{
perror("open");
exit(1);
}
whil