linux进程通信中有名管道的特点,Linux进程间通信之管道简述

这篇文章我们将介绍Linux间进程通间信中的有名管道与无名管道。

一.无名管道

无名管道是一种特殊类型的文件,在内核中对应的资源即一段特殊内存空间,这段空间完全由操作系统管理和维护。可以使用read/write等函数进行读写操作,但不能使用lseek函数来修改当前的读写位置,因为管道需要满足FIFO的原则。

读写无名管道:

读写管道使用的系统调用就是read和write,两者都默认以阻塞方式读写管道,如果要修改这两个函数的行为,可以使用fcntl函数实现。

读写特点:

ab1bc2a1c986969b1d23e6c2e54f5e8c.png

fc785976a28a238e7584438c64aa846f.png

41355724280dc760140dc270f80a5f3d.png

ca34a4410351811e5ccba1ff9bc3ee48.png

d7f5386faf9a7084162c1b20d10d36d5.png

利用无名管道实现子进程发送数据,父进程接收数据:

#include

#include

#include

int main(){

int filedes[2];

char buf[10] = {0};

pipe(filedes);

printf("Please input your string: \n");

if(fork() == 0)

{

close(filedes[0]);

while(1){

fgets(buf, 10, stdin);

int ret = write(filedes[1], buf, strlen(buf));

if(ret < 0)

break;

}

}

else

{

close(filedes[1]);

while(1){

int ret = read(filedes[0], buf, sizeof(buf));

if(ret < 0)

break;

printf("The msg that you input is : %s\n", buf);

printf("Please input your string: \n");

memset(buf, 0, sizeof(buf));

}

}

return 0;

}

二.有名管道

有名管道FIFO依赖于文件系统,是一个存在的特殊文件,因此,FIFO可以在同主机任意进程间实现通信。

有名管道虽然和普通文件一样具有磁盘存放路径、文件权限和其他属性;但是,它和普通文件又有区别,有名管道并没有在磁盘中存放真正的信息,它存储的通信信息在内存中,两个进程结束后自动丢失,拥有的一个磁盘路径仅仅是一个接口,其目的是使用进程间信息的编程更简单统一。通信的两个进程结束后,它的文件路径本身仍然存在,这是和无名管道不一样的地方。

读写有名管道:

通过write和read来操作有名管道前,需要调用open()函数打开该文件,另外,操作有名管道的阻塞位置为open位置,而不是无名管道的读写位置。

读写特点:

f6b7551f9c42a5330fe3b82f6e6eabc1.png

单进程读写有名管道:

#include

#include

#include

#include

#include

#define FIFO_MODE 00600

#define FD_FLAG O_RDWR

int main(int argc, char** argv){

char buf[] = "Lance#";

char RecvBuf[20] = {0};

unlink(argv[1]);

mkfifo(argv[1], FIFO_MODE);

int fd = open(argv[1], FD_FLAG);

write(fd, buf, sizeof(buf));

read(fd, RecvBuf, sizeof(buf));

puts(RecvBuf);

return 0;

}

执行结果:

2df9ee022a4527a8bbac35542ea68344.png

管道基本特点总结:

da8b55516a3b4cc7441742db11ad4064.png

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值