FIFO与并发进程的问题

时间:2013-05-06 09:40:20

标签: c unix concurrency fifo errno

预告他们即使他们不是父母也不是父母的过程。

MAKE FIFO:

/* Create response FIFO. */
if (mkfifo(RESP_FIFO_NAME, FIFO_MODE) == -1) {
    if (errno != EEXIST) {
        fprintf(stderr, "Server: Couldn’t create %s FIFO.\n", RESP_FIFO_NAME);
        exit(1);
    }
}

前叉:

/* 3. Fork the client process. */
switch (fork()) {

/* Fork failed. */
case (pid_t) -1:
    fprintf(stderr, "Call to fork failed.\n"); 
    exit(1);

/* Client (child) process. */
case 0:
    execlp(CLIENT_NAME, CLIENT_NAME, argv[SERVER_CMD_FILE_ARG], argv[SERVER_LOG_FILE_ARG], NULL);

/* Server (parent) Process */
default:
    sleep(1);
    server(infd, outfd, argv[INIT_DB_ARG], argv[FINAL_DB_ARG]);
} /* End of switch. */

服务器功能:

int server(int infd, int outfd, char *init_db_name, char *final_db_name) {
...
if ((outfd = open(RESP_FIFO_NAME, O_WRONLY)) == -1) {
            fprintf(stderr, "Server: Failed to open %s FIFO.\n", RESP_FIFO_NAME);
            perror(RESP_FIFO_NAME);
            exit(1);
        }
...
}

客户端程序:

printf("RESP_FIFO FILE DESCRIPTOR: %d\n", infd);
/* Open the response FIFO for reading. */
if ((infd = open(RESP_FIFO_NAME, O_RDONLY)) == -1) {
    fprintf(stderr, "Client: Failed to open %s FIFO.\n", RESP_FIFO_NAME);
    exit(1);
}
else printf("RESP_FIFO FILE DESCRIPTOR: %d\n", infd);

TL; DR 在打开服务器程序中的调用之前,未在客户端程序中打开读取调用。

4 个答案:

答案 0 :(得分:1)

你是否在其另一端开放阅读之前打开了写作的响应?见fex。 Having a trouble with opening FIFO in C

要么等到你知道FIFO打开读取或打开阻塞,要等待客户端。还要确保服务器具有FIFO文件的写权限。

答案 1 :(得分:0)

这个

pipe()怎么样?

来自pipe(2)

Create descriptor pair for interprocess communication.

The pipe() function creates a pipe (an object that allows unidirectional data flow) and allocates a pair of file descriptors. The first descrip- tor connects to the read end of the pipe; the second connects to the write end.

Data written to fildes1 appears on (i.e., can be read from) fildes[0].

您可以查看memcached如何使用它

答案 2 :(得分:0)

是的,没有阅读器,用于写入的文件系统FIFO的open()将阻塞,或者在非阻塞情况下,使用ENXIO失败。

您至少有两个简单的选择。

首先,您可以打开“命令”FIFO,非阻塞,用于读取以及以写入O_RDWR或两个单独的文件描述符,一个O_RDONLY和一个O_WRONLY。

其次,您可以使用文件系统 socket ,让服务器在那里监听。这为您提供了一个双向的双向沟通​​渠道。

UNIX也为您提供了其他选项 - 消息队列或文件或共享内存段,可能会使用一个对话者的信号来刺激另一个 - 但是上面的内容非常简单。

答案 3 :(得分:0)

我在一端写入了一个FIFO而没有读出另一端。只是打开文件进行读写是不够的,你必须从FIFO中读出文本,否则程序会出错(如果你设置了O_NONBLOCK标志,则为ENXIO)。