深刻理解linux进程间通信(ipc),Linux进程间通信 --- 管道

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

一.无名管道

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

读写无名管道:

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

读写特点:

5dbc963f35ffe87e7e4adb0dbc69547e87d.jpg

afff922879c609778d1c69b41a0d0588610.jpg

ce76e84b82caa8c6f82a4477a9e39591d42.jpg

cc2dbd97db223a2f0a6095f2ae6f0ece965.jpg

2a73791f8eda497afa7091916d2ed652d35.jpg

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

#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位置,而不是无名管道的读写位置。

读写特点:

75facd94526ccd4e62d62ed6dac6f4fcd53.jpg

单进程读写有名管道:

#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;

}

执行结果:

cf819d092984d6727cec307908e361543d9.jpg

管道基本特点总结:

2b4d366f38350644c14532e325e848069ef.jpg

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值