关闭

进程通信(接上篇PFIFO)

407人阅读 评论(0) 收藏 举报
对于pipe只能用于一个进程家族之间通信,如果想要让管道在更宽泛的环境中,那是不行的,原因是它没有名字的,另外的进程看不到它,这样就有了命名管道。
命名管道叫FIFO,可以用mkfifo()在磁盘上创建一个FIFO文件
这就是它与pipe的本质区别,pipe完全就是存在与内存中
当进程想通过该FIFO来通信时就可以标准的open打开该文件,然后开始读写操作。
对于FIFO的读写实现,它与pipe的区别在于:FIFOopen这一操作,而pipe是在调用pipe这个系统调用时直接创建了一对文件描述符用于通信。
并且,FIFOopen操作还有些细致的地方要考虑,例如如果写者先打开,尚无读者,那么肯定是不能通信了,所以就需要先去睡眠等待读者打开该FIFO,反之对读者亦然。
所需头文件

     #include <sys/types.h>

     #include <sys/stat.h>

 

命名管道FIFO举例:

写端:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>

#define FIFO_NAME "/tmp/my_fifo"

#define BUFFER_SIZE PIPE_BUF

#define TEN_MEG (1024 * 1024 * 10)

  int main()

{

    intpipe_fd;

    int res;

    intopen_mode = O_WRONLY;

    intbytes_sent = 0;

    char buffer[BUFFER_SIZE + 1];

    if (access(FIFO_NAME, F_OK) == -1) {

        res = mkfifo(FIFO_NAME, 0777);

        if (res != 0) {

            fprintf(stderr, "Could not create fifo %s\n", FIFO_NAME);

            exit(EXIT_FAILURE);

        }

    }

printf("Process %d opening FIFO O_WRONLY\n", getpid());

    pipe_fd = open(FIFO_NAME, open_mode);

    printf("Process %d result %d\n", getpid(), pipe_fd);

    if (pipe_fd != -1) {

        while(bytes_sent < TEN_MEG) {

            res = write(pipe_fd, buffer, BUFFER_SIZE);

            if (res == -1) {

                fprintf(stderr, "Write error on pipe\n");

                exit(EXIT_FAILURE);

            }

            bytes_sent += res;

        }

        (void)close(pipe_fd);

    }

    else {

        exit(EXIT_FAILURE);       

    }

    printf("Process %d finished\n", getpid());

    exit(EXIT_SUCCESS);

}

读端:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>

#define FIFO_NAME "/tmp/my_fifo"

#define BUFFER_SIZE PIPE_BUF

int main()

{

    intpipe_fd;

    int res;

    intopen_mode = O_RDONLY;

    char buffer[BUFFER_SIZE + 1];

    intbytes_read = 0;

    memset(buffer, '\0', sizeof(buffer));

   

    printf("Process %d opening FIFO 

                        O_RDONLY\n", getpid());

    pipe_fd = open(FIFO_NAME, open_mode);

    printf("Process %d result %d\n", getpid(),

               pipe_fd);

if (pipe_fd != -1) {

        do {

            res = read(pipe_fd, buffer, BUFFER_SIZE);

            bytes_read += res;

        } while (res > 0);

        (void)close(pipe_fd);

    }

    else {

        exit(EXIT_FAILURE);

    }

    printf("Process %d finished, %d bytes read\n", getpid(), bytes_read);

    exit(EXIT_SUCCESS);

}

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6634次
    • 积分:179
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:1篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论