进程通信之管道通信

编写两个程序,一个程序是对管道的写数据、另一个是对管道的读数据。

有名管道的创建mkfifo

 

 

读数据:fifo_read.c

/* fifo_read.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()
{
    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_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);
    return 0;
}

 

posted @ 2016-06-19 10:25  我有一壶酒  阅读(284)  评论(0编辑  收藏  举报