- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我创建了一个 FIFO,写入并取消链接。令我惊讶的是,我在取消链接后能够从 fifo 读取数据,这是为什么?
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_BUF 256
int main()
{
int fd;
char * myfifo = "/tmp/myfifo";
/* create the FIFO (named pipe) */
mkfifo(myfifo, 0666);
int pid = fork();
if (pid != 0)
{
/* write "Hi" to the FIFO */
fd = open(myfifo, O_WRONLY);
write(fd, "Hi", sizeof("Hi"));
close(fd);
/* remove the FIFO */
unlink(myfifo);
}
else
{
wait(NULL);
char buf[MAX_BUF];
/* open, read, and display the message from the FIFO */
fd = open(myfifo, O_RDONLY);
read(fd, buf, MAX_BUF);
printf("Received: %s\n", buf);
close(fd);
return 0;
}
return 0;
}
最佳答案
除非您将 O_NONBLOCK
标志传递给 open(2)
,否则打开一个 FIFO block 直到打开另一端。来自 man 7 fifo
:
The FIFO must be opened on both ends (reading and writing) before data can be passed. Normally, opening the FIFO blocks until the other end is opened also.
A process can open a FIFO in nonblocking mode. In this case, opening for read only will succeed even if no-one has opened on the write side yet, opening for write only will fail with ENXIO (no such device or address) unless the other end has already been opened.
也就是说,您的父/子进程在打开 FIFO 时隐式同步。所以当父进程调用 unlink(2)
时,子进程早就打开了 FIFO。因此, child 总是找到 FIFO 对象并在父对其调用 unlink(2)
之前打开它。
关于 unlink(2)
的注释:unlink(2)
只是从文件系统中删除文件名;只要至少有一个进程打开了文件(在本例中为 FIFO),底层对象就会持续存在。只有在该进程终止或关闭文件描述符后,操作系统才会释放相关资源。 FWIW,这与这个问题的范围无关,但似乎值得注意。
其他一些(不相关的)评论:
wait(2)
。它会返回一个错误(你立即忽略),因为 child 没有 fork 任何进程。mkfifo(3)
, fork(2)
, open(2)
, read(2)
, write(2)
, close(2)
和 unlink(2)
都可能失败并返回 -1
.您应该优雅地处理可能的错误,而不是忽略它们。这些玩具程序的常见策略是使用 perror(3)
打印描述性错误消息并终止。pipe 创建它(2)
在fork之前,让 child 可以访问)。关于c - unlink() 后从 FIFO 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32287079/
我的应用程序有一个 ' Photo ' 字段来存储 URL。它使用 sfWidgetFormInputFileEditable对于小部件架构。要在上传新图像时删除旧图像,我在覆盖的 setter 中设
在代码示例中,我有时会发现像这样的行: import android.app.Activity import android.os.Bundle 我在文档中找不到关于此的任何内容。为什么要用这个,有什
我正在使用一个名为 Jquery-Oembed-All 的插件来嵌入来自 soundcloud 的音频。我将轨道名称、年份和 URL 存储在数据库中,经过查询后,音频已嵌入我的网站。我的问题是显示的文
想删除一个产品,删除产品的图片,但又不想缺什么。产品删除正常但不删除图像 if((isset($_GET["remove"])) && ($_GET["remove"] != "")){ $i
PHP unlink() not working to delete files 我的代码在数据库中正确删除,但无法从文件中删除,请问如何帮助我删除上传文件中的数据? Query($strSQL);
我试图预测我可以使用 unlink() 删除哪些文件。 到目前为止,我的理解是该文件必须对其他人可写,或者与执行程序具有相同的组 ID 或所有者 ID。 还有其他情况吗?我正在尝试解释我的程序如何删除
我正在编写进程间通信的代码。 在接收进程代码中我调用了方法 unlink("datapipe"); 我还包含了#include 头文件。 最后我得到了以下错误: receiver.c:12: erro
for($i=0; $i (来源:http://au1.php.net/chdir) 关于php - unlink() 不起作用,我们在Stack Overflow上找到一个类似的问题: https:
我遇到一个问题,如果在清理期间由网络用户打开,用 Java 编写的存档模块无法清理通过 smb 共享的文件。以下是文件清理代码的简化版本: private static boolean mov
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我在通过 unlink() 函数删除文件时遇到问题。当文件使用西里尔文名称时,该功能不起作用。 [24-Jul-2012 00:33:35 UTC] PHP Warning: unlink(/home
好吧,我一直想知道我是否可以正确处理 unlink() 函数。我不希望 unlink() 函数在无法取消链接文件时抛出一些讨厌的错误(可能是由于找不到文件)。 我尝试了类似的东西 try {
最近在写个网站,需要上传图片,如果修改图片,就图片就没有用了,会占用服务器的硬盘资源,所以想到用unlink函数删除旧照片. 问题 : unlink函数只能删除 相对于函数执行文件的相对目录&nb
我正在尝试通过 AJAX 函数取消链接来删除图像,该函数在传递文件路径之前使用encodeURIComponent对文件路径进行编码。但是,我在取消链接时遇到错误,所以我做了一些尝试来查找错误。 当我
我想读取命令行参数中给出的文件并在读取后将其删除。这就是我正在做的事情。 char *filename = argv[1]; char *outputfile = strcat(argv[1], ".
我在使用 featherlight 时遇到了一些问题,由于某种原因它无法正常工作,我正在使用 Ghost 作为平台并且我使用 Ghost 的 Markdown 将几张图片添加到帖子中,为了使 feat
这个问题在这里已经有了答案: 关闭 13 年前。 Possible Duplicate: Deleting files by type in Python on Windows 如何删除目录中所有扩
来自 APUE #include int unlink(const char *pathname); Only when the link count reaches 0 can the conte
我试图在第一次显示后从服务器中删除图片 (.jpg)。但是文件在显示之前被删除(unlink();)。我已经尝试过使用 sleep() 但这只会延迟加载,并且在显示之前删除所有文件。 最佳答案 您可以
我是 Node.js 新手。 const fs = require('fs'); fs.unlink('/tmp/hello', (err) => { if (err) throw err;
我是一名优秀的程序员,十分优秀!