在计算中,命名管道(也称为FIFO )是用于内部进程通信的方法之一。
- 它是Unix上传统管道概念的扩展。传统的管道是“未命名”的,并且只能持续该过程。
- 但是,命名管道可以在系统正常运行的情况下持续使用,超过过程的寿命。如果不再使用,可以将其删除。
- 通常,命名管道显示为文件,并且通常进程附加到该文件以进行进程间通信。 FIFO文件是本地存储中的一种特殊文件,它允许两个或多个进程通过对该文件进行读/写操作来相互通信。
- 通过在C中调用mkfifo() ,将FIFO特殊文件输入文件系统。以这种方式创建FIFO特殊文件后,任何进程都可以以与普通文件相同的方式打开该文件以进行读取或写入。但是,必须在两端同时打开它,然后才能继续对其进行任何输入或输出操作。
创建FIFO文件:为了创建FIFO文件,使用了一个函数调用,即mkfifo。
int mkfifo(const char *pathname, mode_t mode);
mkfifo()创建一个名称为pathname的FIFO特殊文件。此处模式指定FIFO的权限。它由进程的umask以通常的方式修改:创建的文件的权限为(mode&〜umask)。
使用FIFO:由于命名管道(FIFO)是一种文件,因此我们可以使用与其关联的所有系统调用,即open , read , write , close 。
举例说明命名管道的示例程序:有两个使用相同FIFO的程序。程序1首先写入,然后读取。程序2首先读取,然后写入。他们都一直这样做直到终止。
Program 1(Writes first)
// C program to implement one side of FIFO
// This side writes first, then reads
#include
#include
#include
#include
#include
#include
int main()
{
int fd;
// FIFO file path
char * myfifo = "/tmp/myfifo";
// Creating the named file(FIFO)
// mkfifo(, )
mkfifo(myfifo, 0666);
char arr1[80], arr2[80];
while (1)
{
// Open FIFO for write only
fd = open(myfifo, O_WRONLY);
// Take an input arr2ing from user.
// 80 is maximum length
fgets(arr2, 80, stdin);
// Write the input arr2ing on FIFO
// and close it
write(fd, arr2, strlen(arr2)+1);
close(fd);
// Open FIFO for Read only
fd = open(myfifo, O_RDONLY);
// Read from FIFO
read(fd, arr1, sizeof(arr1));
// Print the read message
printf("User2: %s\n", arr1);
close(fd);
}
return 0;
}
Program 2(Reads First)
// C program to implement one side of FIFO
// This side reads first, then reads
#include
#include
#include
#include
#include
#include
int main()
{
int fd1;
// FIFO file path
char * myfifo = "/tmp/myfifo";
// Creating the named file(FIFO)
// mkfifo(,)
mkfifo(myfifo, 0666);
char str1[80], str2[80];
while (1)
{
// First open in read only and read
fd1 = open(myfifo,O_RDONLY);
read(fd1, str1, 80);
// Print the read string and close
printf("User1: %s\n", str1);
close(fd1);
// Now open in write mode and write
// string taken from user.
fd1 = open(myfifo,O_WRONLY);
fgets(str2, 80, stdin);
write(fd1, str2, strlen(str2)+1);
close(fd1);
}
return 0;
}
输出:在两个终端上同时运行两个程序。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。