1

假装它们不是父子进程,即使它们是。

制造先进先出:

/* 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在服务器程序中的 open for write 调用之前,未执行客户端程序中的 open for read 调用。

4

4 回答 4

1

您是否在另一端打开读取之前打开响应 fifo 进行写入?见费克斯。在 C 中打开 FIFO 时遇到问题

要么等到您知道 FIFO 已打开以供读取,要么进行打开阻塞以等待客户端。还要确保服务器对 FIFO 文件具有写入权限。

于 2013-05-06T12:30:34.290 回答
0

我在一端写入 FIFO,而没有从另一端读出。仅仅打开文件进行读写是不够的,您必须实际从 FIFO 中读取文本,否则程序将引发错误(如果您设置了 O_NONBLOCK 标志,则为 ENXIO)。

于 2013-05-06T13:59:50.653 回答
0

pipe()为此怎么办

管道(2)

为进程间通信创建描述符对。

pipe() 函数创建一个管道(一个允许单向 数据流)并分配一对文件描述符。第一个描述—— tor 连接到管道的读取端;第二个连接到 写完。

写入 fildes 1的数据出现在 fildes[0] 上(即可以从中读取)。

你可以看看memcached是如何使用它的

于 2013-05-06T10:42:31.167 回答
0

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

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

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

其次,您可以改用文件系统套接字,并让服务器在那里侦听。这为您提供了一个在一个地点上的双向通信通道。

UNIX 也为您提供了其他选项——消息队列或文件或共享内存段,也许使用信号让一个对话者刺激另一个对话者——但上述内容非常简单。

于 2013-05-06T13:09:57.867 回答