进程间的通信

进程间的通讯

pipe管道

在这里插入图片描述管道是一种最基本的IPC机制,由pipe函数创建

#include <unistd.h>
int pipe(int filedes[2]);
管道作用于有血缘关系的进程之间,通过fork来传递

管道中filedes[1]指向写端,filedes[0]指向读端,所以管道在用户程序看起来就像一个打开的文件,通过read[filedes[0]],或者write(filedes[1]);向这个文件读写数据其实就是在读写内核缓存区。pipe函数调用成功返回0,调用失败返回-1
两个进程通过管道实现通信
fork 学院关系新城的单向通信
在这里插入图片描述
管道中采用的是环形队列实现的大小为64K

通信的方向确定:
1.父读子写,关闭父写和子读
2.子读父写,关闭父读和子写

pipe函数调用成功返回0,调用失败返回-1
案例:

#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 80
int main(void)
{
int n;
int fd[2];
pid_t pid;
char line[MAXLINE];
if (pipe(fd) < 0) {
perror("pipe");
exit(1);
}
if ((pid = fork()) < 0)
 {

perror("fork");
exit(1);
}
if (pid > 0) { /* parent */
close(fd[0]); //修改可以改变父读还是子读
write(fd[1], "hello world\n", 12);
wait(NULL);
} else { /* child */
close(fd[1]); //修改可以改变父读还是子读
n = read(fd[0], line, MAXLINE);
write(STDOUT_FILENO, line, n);
}
return 0;
}

pipe使用注意事项:
1.写关闭,读端读完管道里的内容,再次读,返回0读到EOF
2.写端末写完,写端暂无数据,读端读完,再取读,阻塞
3.读关闭,写端写管道,产生SIGPIPE信号,默认写进程会终止进程
4.写满了,读未读完,再次写,发生阻塞。

fifo有名管道

创建一个有名管道,解决无血缘关系的进程通信, fifo:
函数

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

命令

xingwenpeng@ubuntu:~$ mkfifo xwp
xingwenpeng@ubuntu:~$ ls -l xwp
prw-rw-r-- 1 xingwenpeng xingwenpeng 0 9月 15 18:34 xwp

当只写打开FIFO管道时,如果没有FIFO没有读端打开,则open写打开会阻塞。
FIFO内核实现时可以支持双向通信。(pipe单向通信,因为父子进程共享同一个file
结构体)
FIFO可以一个读端,多个写端;也可以一个写端,多个读端。
dup/dup2
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
dup和dup2都可用来复制一个现存的文件描述符
返回当前文件面舒服表最小的数值
用于复制新的文件描述符

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值