进程间通信(IPC)
1.管道
-
管道:也是一种文件,管道文件
-
管道文件的创建:
mkfifo Pipe_name
-
分类:有名管道(任意两个进程间)、无名管道(只能父子进程间)
-
FIFO文件存储 内存:断电即消失
-
伴随着同步:写端写满阻塞,读端空为阻塞
-
进程同步:同一时刻,只能有一个进程访问该资源。进程同步的主要目的是保护共享资源,防止多个进程同时访问同一资源导致的数据不一致。
-
示例代码:open打开管道文件,fgets通过stdin写入到buff中,再通过write写入到管道文件中,两端各自read和write,就是把进程间的一个信息给到另一个进程
有名管道 创建:mkfifo FIFO
a.c b.c
a. C向管道文件中写入数据 b.c从管道文件中读取数据
-
无名管道,进行父子进程间的通讯
pipe(fd),创建无名管道,默认fd[0]为读端 fd[1]为写端
- 管道通讯的特点:
1.半双工(双向,不允许同时), 套接字:全双工(双向,可同时)
2.管道没有数据,read阻塞
3.管道的写端关闭,read返回0
4.管道读端关闭,写端产生异常 (发送信号,SIGPIPE,程序收到信号异常终止)
2.dup
-
dup2 重定向
int fd = open(“a.txt”,0 WRONLYIO CREAT,0600 );
dup2(fd,1); 然后printf打印的都到a.txt里了,就相当于fd替换了文件描述符1,然后printf是根据文件描述符的
-
dup 复制
dup(fd);
将fd复制一份,分配给文件表中未被使用的最小的一项