mkfifo()
我正在 Ubuntu 18 和 16 环境中使用 gcc 作为编译器(和)以 C 语言创建命名管道open()
。我注意到的一件事是,进程结束后命名管道仍保留在文件系统中。while(1)
由于我的要求,我的进程是一个无限循环运行的进程,退出的唯一方法是 ctrl-c 或kill
linux 中的命令。我可能会添加一个 ctrl-c 信号来正确处理这些情况,但这不是问题。
鉴于命名管道保留在文件系统中(例如/tmp/named_pipe1
),我是否需要检查命名管道是否存在于文件系统中并在进程开始时将其删除(因为该文件保留在系统中),或者它是多余的因为即使文件保留在文件系统中,它的缓冲区也会被删除,我可以像新的新鲜 fifo 一样使用它吗?因为当我按 ctrl-c 退出上一次运行的代码并启动新的代码时,我不希望 fifo 缓冲区混合。当我重新启动代码时,我需要一个空缓冲区。
笔记:在进程运行之间系统不会重新启动。只是重新运行该过程。
提前致谢。
答案1
进行第一个函数调用来销毁 fifo。您并不真正关心呼叫是否失败。然后调用mkfifo()
(一定要检查返回值以确保操作成功。
第一个调用是unlink()
语法如下:
#include <unistd.h>
int unlink(const char *pathname);
以下是 MAN 页面的描述:
unlink() 从文件系统中删除一个名称。如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且它所使用的空间可供重用。
如果该名称是文件的最后一个链接,但任何进程仍打开该文件,则该文件将保持存在,直到引用它的最后一个文件描述符关闭。
如果该名称引用了符号链接,则该链接将被删除。
如果名称引用套接字、FIFO 或设备,则其名称将被删除,但打开该对象的进程可以继续使用它。
返回值 成功时,返回零。出错时,返回 -1,并适当设置 errno。
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
*描述 mkfifo() 创建一个名为 pathname 的 FIFO 特殊文件。 mode 指定 FIFO 的权限。它由进程的umask以通常的方式修改:创建的文件的权限是(mode & ~umask)。
FIFO 特殊文件与管道类似,只是创建方式不同。不是匿名通信通道,而是通过调用 mkfifo() 将 FIFO 特殊文件输入到文件系统中。
一旦以这种方式创建了 FIFO 特殊文件,任何进程都可以打开它进行读取或写入,就像普通文件一样。但是,它必须在两端同时打开,然后才能对其进行任何输入或输出操作。打开 FIFO 进行读取通常会阻塞,直到其他进程打开同一 FIFO 进行写入,反之亦然。请参阅 fifo(7) 了解 FIFO 特殊文件的非阻塞处理。*
返回值 如果成功,mkfifo() 和 mkfifoat() 返回 0。如果出现错误,则返回 -1(在这种情况下,会适当设置 errno)。