我为FIFO写了一个测试。服务器通过FIFO将字符串“hello”写入客户端。但是似乎两个进程都被阻塞了,我认为FIFO是开放的,以便服务器和客户端进行读写操作。但是这两个过程什么都不输出。

/* FIFO test */

#include <stdio.h>
#include <sys/types.h>
#include <sys.stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#define FIFOPATH  "/home/hel/fifo" // define file path

int client(void);
int server(void);

int main(void)
{
    pid_t pid;

    /* create FIFO */
    if (mkfifo(FIFOPATH, S_IRUSR | S_IWUSR) < 0) {
        if (errno == EEXIST) { // already exists, ok
        }

        /* error */
        else {
            exit(-1);
        }
    }
    /* create process */
    pid = fork();
    if (pid < 0) { // error, process exits.
        exit(-1);
    } else if (pid == 0) { // child, server
          server();

          return 0; // exit
    }

    /* parent, client */
    client();

    return 0;
}

/* server */
int server(void)
{
    int ret;
    int fd;

    /* open fifo for writing */
    if ((fd = open(FIFOPATH, 0200)) < 0) {
        printf("%s\n", strerror(errno));
        return -1; // error
    }

    ret = write(fd, "hello", 5);
    close(fd);

    return 0;
}

/* client */
int client(void)
{
    char recvBuf[100];
    int fd;
    int ret;

    /* open fifo for reading */
    if ((fd = open(FIFOPATH, 0400)) < 0) {
        printf("%s\n", strerror(errno));
        return -1; // error
    }

    ret = read(fd, recvBuf, 5);
    printf("ret: %d %d\n", ret, fd);
    printf("client receive %s\n", recvBuf);

    close(fd);
    return 0;
}

最佳答案

您的代码有两个问题。第一个是主要问题。

  • 传递给flagsopen参数不正确。正如您所提供的那样,它们不应该是Unix文件许可标志。服务器应使用O_WRONLY,客户端应使用O_RDONLY
  • write(fd, "hello", 5);read(fd, recvBuf, 5);不写入和读取字符串的终止NUL字符。但随后将其打印为字符串:printf("client receive %s\n", recvBuf);。这将调用“未定义行为”(即使很有可能该程序似乎在“工作”)。将5更改为6
  • 关于c - 为什么在打开FIFO时进程被阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38176494/

    10-15 12:21