• Unix IPC之FIFO


    #include    "unpipc.h"
    
    #define FIFO1   "/tmp/fifo.1"
    #define FIFO2   "/tmp/fifo.2"
    // #define  FILE_MODE   (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
    void    client(int, int), server(int, int);
    
    int
    main(int argc, char **argv)
    {
        int     readfd, writefd;
        pid_t   childpid;
    
        /* 4create two FIFOs; OK if they already exist */
        if ((mkfifo(FIFO1, FILE_MODE) < 0) && (errno != EEXIST))
            err_sys("can't create %s", FIFO1);
        if ((mkfifo(FIFO2, FILE_MODE) < 0) && (errno != EEXIST))
        {
            unlink(FIFO1); // 由于err_sys中含有exit函数,这里要在退出之前要删除FIFO1
            err_sys("can't create %s", FIFO2);
        }
    
        if ( (childpid = Fork()) == 0)          /* child */
        {
            readfd = Open(FIFO1, O_RDONLY, 0); // FIFO1 READ
            writefd = Open(FIFO2, O_WRONLY, 0); // FIFO2 WRITE
    
            server(readfd, writefd);
            exit(0);
        }
        /* 4parent */
        writefd = Open(FIFO1, O_WRONLY, 0); // FIFO1 WRITE
        readfd = Open(FIFO2, O_RDONLY, 0); // FIFO2 READ
    
        client(readfd, writefd);
    
        Waitpid(childpid, NULL, 0);     /* wait for child to terminate */
    
        Close(readfd);
        Close(writefd);
    
        Unlink(FIFO1); // 删除管道FIFO1
        Unlink(FIFO2); // 删除管道FIFO2
        exit(0);
    }
    
    
    /** 
     * 现在来看一下上面那个程序
     * (假设)服务器代码先运行,因此:
     * 当起运行到readfd = open(FIFO1, O_RDONLY, 0);的时候,还没有任何进程以O_WRONLY方式打开FIFO1,进程阻塞在这里;
     * 
     * 然后客户端代码开始运行,但运行到这个地方的时候:writefd = open(FIFO1, O_WRONLY, 0);
     * 服务器阻塞的地方开始释放,而在客户端,因为FIFO1在服务器已经是以O_RDONLY打开了,所以继续运行。
     *
     * 如果客户端的这两个open交换一个顺序
     * 那么readfd = open(FIFO2, O_RDONLY, 0);先运行,则由于FIFO2还没有以O_WRONLY方式打开,所以客户端也阻塞,客户和服务器都阻塞
     * 大家都在等对方的资源,这种情况我们称之为死锁(deadlock)
     *
     * 总结:
     * writefd = open(FIFO1, O_WRONLY, 0); 这个是用只写方式打开管道,
     * 如果FIFO1此时已经有别的进程以只读方式打开(就是说在这条代码运行之前,已经有代码open(FIFO1, O_RDONLY, 0)运行),
     * 则此函数返回成功,否则,将会阻塞到有别的进程以只读方式打开FIFO1为止。反过来也一样。
     *
     */

    2015-08-12 14:55:52

    程序的目的及函数介绍请参考:http://www.cnblogs.com/fengkang1008/p/4721478.html

    这里用FIFO来替代PIPE。

  • 相关阅读:
    实例说明Java中的null(转)
    Java中初始变量默认值
    Java中finally关键字的使用(转)
    java作用域
    import static和import的区别
    static class
    [APUE]标准IO库(下)
    [APUE]标准IO库(上)
    [APUE]文件和目录(下)
    [APUE]文件和目录(中)
  • 原文地址:https://www.cnblogs.com/fengkang1008/p/4724372.html
Copyright © 2020-2023  润新知