📜  用示例C程序命名管道或FIFO(1)

📅  最后修改于: 2023-12-03 15:27:13.337000             🧑  作者: Mango

使用示例C程序命名管道或FIFO

在Linux系统中,管道是用于进程间通信的一种特殊文件。其中,命名管道也被称为FIFO(First-In-First-Out)管道,是一种特殊的管道,允许不同进程之间进行通信。

本文将介绍如何使用C语言创建和使用命名管道。

创建命名管道

命名管道可以在命令行下使用mkfifo命令创建,也可以通过C语言程序进行创建。下面是一个示例代码,可以创建一个名为myFIFO的命名管道:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

#define FIFO_NAME "myFIFO"

int main()
{
    int ret;
    ret = mkfifo(FIFO_NAME, 0666);
    if (ret != 0) {
        printf("can not create fifo %s\n", FIFO_NAME);
        exit(EXIT_FAILURE);
    }
    printf("fifo %s created\n", FIFO_NAME);
    exit(EXIT_SUCCESS);
}

上述代码中,使用mkfifo函数创建一个名为myFIFO的命名管道,并指定了权限为0666。如果管道创建成功,会输出“fifo myFIFO created”,否则会输出“can not create fifo myFIFO”。

使用命名管道

创建了命名管道后,可以通过C语言程序进行读写操作。

写入数据

下面是一个示例代码,可以向命名管道中写入一些数据:

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

#define FIFO_NAME "myFIFO"

int main()
{
    int fd;
    char buf[1024];
    fd = open(FIFO_NAME, O_WRONLY);
    if (fd < 0) {
        printf("can not open fifo %s for writing\n", FIFO_NAME);
        exit(EXIT_FAILURE);
    }
    printf("input data to write:\n");
    fgets(buf, sizeof(buf), stdin);
    write(fd, buf, sizeof(buf));
    close(fd);
    exit(EXIT_SUCCESS);
}

上述代码中,使用open函数打开了名为myFIFO的命名管道,并使用write函数向管道中写入了数据。需要注意的是,使用命名管道进行读写操作时,需要以正确的方式打开管道文件。在本例中,O_WRONLY参数指定了文件打开方式为只写模式。

读取数据

下面是一个示例代码,可以从命名管道中读取数据并输出:

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

#define FIFO_NAME "myFIFO"

int main()
{
    int fd;
    char buf[1024];
    fd = open(FIFO_NAME, O_RDONLY);
    if (fd < 0) {
        printf("can not open fifo %s for reading\n", FIFO_NAME);
        exit(EXIT_FAILURE);
    }
    read(fd, buf, sizeof(buf));
    printf("read data from fifo:\n%s\n", buf);
    close(fd);
    exit(EXIT_SUCCESS);
}

上述代码中,使用open函数打开了名为myFIFO的命名管道,并使用read函数从管道中读取数据。需要注意的是,使用命名管道进行读写操作时,需要以正确的方式打开管道文件。在本例中,O_RDONLY参数指定了文件打开方式为只读模式。

总结

本文介绍了如何使用C语言程序创建和使用命名管道。在实际应用中,命名管道常常用于进程间通信、文件传输等场景,是非常重要的 Linux IPC 工具之一。