gpt4 book ai didi

C、是否可以阻塞进程直到再次打开管道?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:47 25 4
gpt4 key购买 nike

我正在组装一个类似服务器的进程,它从命名管道接收数据并返回一些输出。

众所周知,当管道打开进行读取时,它会阻塞进程,直到另一个进程打开管道进行写入。 (除非设置了非阻塞标志。)当另一个进程打开管道并写入时,我们可以获得这样的输入:

...
opened_pipe = fopen(argv[1], "r")
while(1)
{
if ( fgets(readbuf, FIFO_READLEN, opened_pipe) != NULL )
{ \\ process the input from the writer }
else
{
\\ this is the branch when the writer closed his end of the pipe and reader gets EOF
\\ usually one exits here
\\ but I would like to freeze the process and wait until another writer comes
\\ (like a server-like application would do)
}
}

但是当作者退出这个while 进入无意义的循环。如果阅读器返回到初始状态会更好 - 进程将被阻塞,直到管道再次连接到另一端。有可能吗?

附言

我试图在我的程序中创建一个虚拟编写器,它打开与 w 相同的管道,并始终在 fgets 的循环中保持打开状态。但这对我不起作用。也许我做错了什么。有可能拉这个把戏吗?

也可以在 while 内不断地关闭和重新打开管道。但我想使用 pipestdin 作为输入流。不如在节目中一视同仁。那么,是否可以通过 fopen 使用一些 "stdin" 文件名重新打开 stdin 流?

最佳答案

只需在服务器进程中打开您的 FIFO 两次 - 第一次用于读取,然后用于写入。这样做(打开它进行写入)将确保如果所有客户端都放弃 FIFO,您的进程将不会看到 EOF。

这是简短的演示:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

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

#define FIFO_NAME "/tmp/fifo"

int main()
{
if (mkfifo(FIFO_NAME, S_IRUSR | S_IWUSR | S_IWGRP) == -1)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}

FILE *readFd = fopen(FIFO_NAME, "r");
FILE *writeFd = fopen(FIFO_NAME, "w");

char c;
for (;;)
{
c = fgetc(readFd);
fprintf(stdout, "Read char: %c\n", c);
}
}

关于C、是否可以阻塞进程直到再次打开管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33444433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com