linux间进程间通信及特点,Linux进程间通信 --- 管道

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

一.无名管道

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

读写无名管道:

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

读写特点:

cd62cbf76922492e666d04e2a8b4f8a7.png

76582bc5586eade3feac4d74a3b407c5.png

cf6c6da516f3f0e7090e3641a18fce5c.png

33f034d3ae341ca31b4765b39751a24a.png

7014e3943a213d691564e704c20c9dca.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 : %sn", buf);

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

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

}

}

return 0;

}

二.有名管道

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

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

读写有名管道:

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

读写特点:

1f4baed5ec9d59c65c575fa41d267212.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;

}

执行结果:

15fc97b65bdb91db3f32a6ea31bb2da6.png

管道基本特点总结:

1bbd7821e1004104f974684bb1cc8252.png

内容来源于网络如有侵权请私信删除

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值