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。

 

posted @ 2015-08-12 14:57  指上弹兵赵小括  阅读(317)  评论(0编辑  收藏  举报