• 进程通信之管道通信


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

    有名管道的创建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
    ");
                exit(1);
            }
        }
    
        /* 以只读阻塞方式打开有名管道 */
        fd = open(MYFIFO, O_RDONLY);
        if(fd == -1)
        {
            printf("Open fifo file error
    ");
            exit(1);
        }
        
        while(1)
        {
            memset(buff, 0, sizeof(buff));
            if((nread = read(fd, buff, MAX_BUFFER_SIZE)) > 0)
            {
                printf("Read '%s' from FIFO
    ",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
    ");
            exit(1);
        }
        sscanf(argv[1], "%s", buff);
        
        /* 以只写阻塞方式打开FIFO管道 */
        fd = open(MYFIFO, O_WRONLY);
        if(fd == -1)
        {
            printf("Open fifo file error
    ");
            exit(1);
        }
    
        /* 向管道中写入字符串 */
        if((nwrite = write(fd, buff, MAX_BUFFER_SIZE)) > 0)
        {
            printf("Write '%s' to FIFO
    ",buff);
        }
        close(fd);
        return 0;
    }
  • 相关阅读:
    English in 999
    面向对象程序设计
    HOOK相关
    很幽默的讲解六种Socket IO模型(转)(Delphi版本)[转]
    P2P之UDP穿透NAT原理并有UDP打洞的源码[转]
    分批导出数据库记录
    DELPHI Winsock完成端口[转]
    由数据库排序差异引起的错误一例总结
    适配器模式
    JQuery+Asp.net+Webservice组成的Autocomplete示例
  • 原文地址:https://www.cnblogs.com/yihujiu/p/5597535.html
Copyright © 2020-2023  润新知