进程间通信之:管道
3.使用实例
下面的实例包含了两个程序,一个用于读管道,另一个用于写管道。其中在读管道的程序里创建管道,并且作为main()函数里的参数由用户输入要写入的内容。读管道的程序会读出用户写入到管道的内容,这两个程序采用的是阻塞式读写管道模式。
以下是写管道的程序:
/*fifo_write.c*/
#includesys/types.h>
#includesys/stat.h>
#includeerrno.h>
#includefcntl.h>
#includestdio.h>
#includestdlib.h>
#includelimits.h>
#defineMYFIFO/tmp/myfifo/*有名管道文件名*/
#defineMAX_BUFFER_SIZEPIPE_BUF/*定义在于limits.h中*/
intmain(intargc,char*argv[])/*参数为即将写入的字符串*/
{
intfd;
charbuff[MAX_BUFFER_SIZE];
intnwrite;
if(argc=1)
{
printf(Usage:./fifo_writestringn);
exit(1);
}
sscanf(argv[1],%s,buff);
/*以只写阻塞方式打开FIFO管道*/
fd=open(MYFIFO,O_WRONLY);
if(fd==-1)
{
printf(Openfifofileerrorn);
exit(1);
}
/*向管道中写入字符串*/
if((nwrite=write(fd,buff,MAX_BUFFER_SIZE))>0)
{
printf(Write'%s'toFIFOn,buff);
}
close(fd);
exit(0);
}
以下是读管道程序:
/*fifo_read.c*/
(头文件和宏定义同fifo_write.c)
intmain()
{
charbuff[MAX_BUFFER_SIZE];
intfd;
intnread;
/*判断有名管道是否已存在,若尚未创建,则以相应的权限创建*/
if(access(MYFIFO,F_OK)==-1)
{
if((mkfifo(MYFIFO,0666)0)(errno!=EEXIST))
{
printf(Cannotcreatefifofilen);
exit(1);
}
}
/*以只读阻塞方式打开有名管道*/
fd=open(MYFIFO,O_RDONLY);
if(fd==-1)
{
printf(Openfifofileerrorn);
exit(1);
}
while(1)
{
memset(buff,0,sizeof(buff));
if((nread=read(fd,buff,MAX_BUFFER_SIZE))>0)
{
printf(Read'%s'fromFIFOn,buff);
}
}
close(fd);
exit(0);
}
为了能够较好地观察运行结果,需要把这两个程序分别在两个终端里运行,在这里首先启动读管道程序。读管道进程在建立管道之后就开始循环地从管道里读出内容,如果没有数据可读,则一直阻塞到写管道进程向管道写入数据。在启动了写管道程序后,读进程能够从管道里读出用户的输入内容,程序运行结果如下所示。
终端一:
$./fifo_read
Read'FIFO'fromFIFO
Read'Test'fromFIFO
Read'Program'fromFIFO
……
终端二:
$./fifo_writeFIFO
Write'FIFO'toFIFO
$./fifo_writeTest
Write'Test'toFIFO
$./fifo_writeProgram
Write'Program'toFIFO
……
linux操作系统文章专题:linux操作系统详解(linux不再难懂)linux相关文章:linux教程
数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论