微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 进程间通信之:管道

进程间通信之:管道

时间:08-13 来源:3721RD 点击:

管道的程序会读出用户写入到管道的内容,这两个程序采用的是阻塞式读写管道模式。

以下是写管道的程序:

/* fifo_write.c */

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <limits.h>

#define MYFIFO "/tmp/myfifo" /* 有名管道文件名*/

#define MAX_BUFFER_SIZE PIPE_BUF /*定义在于limits.h中*/

int main(int argc, char * argv[]) /*参数为即将写入的字符串*/

{

int fd;

char buff[MAX_BUFFER_SIZE];

int nwrite;

if(argc <= 1)

{

printf("Usage: ./fifo_write string\n");

exit(1);

}

sscanf(argv[1], "%s", buff);

/* 以只写阻塞方式打开FIFO管道 */

fd = open(MYFIFO, O_WRONLY);

if (fd == -1)

{

printf("Open fifo file error\n");

exit(1);

}

/*向管道中写入字符串*/

if ((nwrite = write(fd, buff, MAX_BUFFER_SIZE)) > 0)

{

printf("Write '%s' to FIFO\n", buff);

}

close(fd);

exit(0);

}

以下是读管道程序:

/*fifo_read.c*/

(头文件和宏定义同fifo_write.c)

int main()

{

char buff[MAX_BUFFER_SIZE];

int fd;

int nread;

/* 判断有名管道是否已存在,若尚未创建,则以相应的权限创建*/

if (access(MYFIFO, F_OK) == -1)

{

if ((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST))

{

printf("Cannot create fifo file\n");

exit(1);

}

}

/* 以只读阻塞方式打开有名管道 */

fd = open(MYFIFO, O_RDONLY);

if (fd == -1)

{

printf("Open fifo file error\n");

exit(1);

}

while (1)

{

memset(buff, 0, sizeof(buff));

if ((nread = read(fd, buff, MAX_BUFFER_SIZE)) > 0)

{

printf("Read '%s' from FIFO\n", buff);

}

}

close(fd);

exit(0);

}

为了能够较好地观察运行结果,需要把这两个程序分别在两个终端里运行,在这里首先启动读管道程序。读管道进程在建立管道之后就开始循环地从管道里读出内容,如果没有数据可读,则一直阻塞到写管道进程向管道写入数据。在启动了写管道程序后,读进程能够从管道里读出用户的输入内容,程序运行结果如下所示。

终端一:

$ ./fifo_read

Read 'FIFO' from FIFO

Read 'Test' from FIFO

Read 'Program' from FIFO

……

终端二:

$ ./fifo_write FIFO

Write 'FIFO' to FIFO

$ ./fifo_write Test

Write 'Test' to FIFO

$ ./fifo_write Program

Write 'Program' to FIFO

……

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top