linux管道运行系统程序,linux系统编程之管道(三)

int main(int argc, char *argv[])

{intfd;

fd= open("p1", O_WRONLY);if (fd == -1)

ERR_EXIT("open error");

printf("open succ");return 0;

}

编译运行:

507305503b756c80b9f0a91f715f97e4.png

6a0b38bff3a4efc3af77b430add73a3a.gif

效果跟先运行读操作一样,这就论证了第一条:“O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO”。下面来看一下非阻塞的情况:

bf859fdcedf95b2c18ee582e1eda4511.png

编译运行:

dcd42a286e0e3536694aa3fbb560e9b5.png

所以就论证了:“O_NONBLOCK enable:立刻返回失败,错误码为ENXIO”。

以上就对有名管道的打开规则进行了说明,下面以一个实例的例子来加深对有名管道用法的认识。因为有名管道是可以不相关的两个进程之间传递数据,所以下面的这个例子是一个进程往管道中写入文件Makefile,然后另外一个进程从管道中读取Makefile并写入到Makefile2,也就变向的进行了文件的拷贝操作,具体代码如下:

5b140808d4828e2fb58c2989e37172f5.png

写文件代码:

#include #include#include#include#include#include#include#include#include#include#include

#define ERR_EXIT(m)

do{

perror(m);

exit(EXIT_FAILURE);

}while(0)int main(int argc, char *argv[])

{

mkfifo("tp", 0644);//创建一个管道文件

intinfd;

infd= open("Makefile", O_RDONLY);//打开Makefile文件

if (infd == -1)

ERR_EXIT("open");intoutfd;

outfd= open("tp", O_WRONLY);//以写的方式打开管道,准备往里面写数据

if (outfd == -1)

ERR_EXIT("open");char buf[1024];intn;while ((n=read(infd, buf, 1024))>0)//将Makefile文件的内容写入到有名管道中

{

write(outfd, buf, n);

}

close(infd);

close(outfd);return 0;

}

读文件并创建文件代码:

#include #include#include#include#include#include#include#include#include#include#include

#define ERR_EXIT(m)

do{

perror(m);

exit(EXIT_FAILURE);

}while(0)int main(int argc, char *argv[])

{intoutfd;

outfd= open("Makefile2", O_WRONLY | O_CREAT | O_TRUNC, 0644);//本地创建一个Makefile2文件

if (outfd == -1)

ERR_EXIT("open");intinfd;

infd= open("tp", O_RDONLY);//以只读的方式打开本地有名管道

if (outfd == -1)

ERR_EXIT("open");char buf[1024];intn;while ((n=read(infd, buf, 1024))>0)//将管道中的数据写入到新创建的Mkaefile2文件以变向实现了文件的拷贝操作

{

write(outfd, buf, n);

}

close(infd);

close(outfd);

unlink("tp");//删除创建的管道文件

return 0;

}

这时来运行来看下效果:

先运行写端:

c719a4cdc6e17e285f7c1576a95c9a7e.png

再运行读端,将管道中的文件读入到新的一个文件:

5ba2fc51d4ad35950d3d7e797bfbd27d.gif

这时,来查看下结果:

8b2e2b5be041b7213041dc72d47571e6.png

并且可以看到,创建的tp临时管道也被删除了,所以通过有名命道就实现了一个数据拷贝的功能,好了,关于管道的知识就先到这,接下来会用一个综合性的例子,来将linux系统编程的所有知识进行一个综合使用,下节再见!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值