int main(int argc, char *argv[])
{intfd;
fd= open("p1", O_WRONLY);if (fd == -1)
ERR_EXIT("open error");
printf("open succ");return 0;
}
编译运行:
效果跟先运行读操作一样,这就论证了第一条:“O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO”。下面来看一下非阻塞的情况:
编译运行:
所以就论证了:“O_NONBLOCK enable:立刻返回失败,错误码为ENXIO”。
以上就对有名管道的打开规则进行了说明,下面以一个实例的例子来加深对有名管道用法的认识。因为有名管道是可以不相关的两个进程之间传递数据,所以下面的这个例子是一个进程往管道中写入文件Makefile,然后另外一个进程从管道中读取Makefile并写入到Makefile2,也就变向的进行了文件的拷贝操作,具体代码如下:
写文件代码:
#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;
}
这时来运行来看下效果:
先运行写端:
再运行读端,将管道中的文件读入到新的一个文件:
这时,来查看下结果:
并且可以看到,创建的tp临时管道也被删除了,所以通过有名命道就实现了一个数据拷贝的功能,好了,关于管道的知识就先到这,接下来会用一个综合性的例子,来将linux系统编程的所有知识进行一个综合使用,下节再见!!