新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 进程间通信之:管道

进程间通信之:管道

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257127.htm

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教程


数字通信相关文章:数字通信原理


通信相关文章:通信原理



上一页 1 2 3 4 5 下一页

评论


相关推荐

技术专区

关闭