- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我了解,根据https://linux.die.net/man/3/mkfifo ,
我得到一个暗示,我必须有读取器和写入器文件,才能
利用管道文件。下面的来源是编写器文件,
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
int main(){
int fd;
char *myfifo = "./myfifo";
mkfifo(myfifo, 0777);
fd = open(myfifo, O_WRONLY);
int PID = fork();
if(PID == 0){
execl("./reader.o", "reader", (char*)NULL);
}
write(fd, "Rock and roll baby\0", sizeof("Rock and roll baby"));
close(fd);
unlink(myfifo);
return 0;
}
下面提供的来源是针对阅读器文件的。
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_BUF 1024
int main(){
int fd;
char* myfifo = "./myfifo";
char buf[MAX_BUF];
fd = open(myfifo, O_RDONLY);
read(fd, buf, MAX_BUF);
write(STDOUT_FILENO, buf, MAX_BUF);
close(fd);
exit(EXIT_SUCCESS);
return 0;
}
当运行编写器文件的可执行文件时,命令提示符进入
打印换行符后停止。我对这个问题的假设是因为
编写器文件中的 open() 无法检测到管道文件,
是这样吗?
谢谢。
最佳答案
我建议你应该在fork之前创建FIFO,但只在fork之后打开FIFO。这避免了各种各样的问题。在大多数情况下,我使用 write()
向标准错误报告错误;它不如使用fprintf(stderr, …)
那么方便不过。
请注意,编写者在消息末尾写入了一个空字节。读取器获取空字节,但在将结果字符数组(它不再是字符串;字符串末尾有一个终端空字节)写入标准输出之前用换行符覆盖它。如果代码使用<stdio.h>
要写入数据(例如 printf("%s\n", buf)
),不需要用换行符替换空字节。
writer.c
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#ifndef READER
#define READER "./reader"
#endif
int main(void)
{
char *myfifo = "./myfifo";
if (mkfifo(myfifo, 0777) != 0)
{
write(STDERR_FILENO, "Failed to create FIFO\n",
sizeof("Failed to create FIFO\n") - 1);
}
int PID = fork();
if (PID == 0)
{
execl(READER, "reader", (char *)NULL);
write(STDERR_FILENO, "Failed to execute reader\n",
sizeof("Failed to execute reader\n") - 1);
exit(EXIT_FAILURE);
}
if (PID < 0)
{
write(STDERR_FILENO, "Failed to fork\n",
sizeof("Failed to fork\n") - 1);
exit(EXIT_FAILURE);
}
int fd = open(myfifo, O_WRONLY);
if (fd < 0)
{
write(STDERR_FILENO, "Failed to open FIFO for writing\n",
sizeof("Failed to open FIFO for writing\n") - 1);
unlink(myfifo);
exit(EXIT_FAILURE);
}
write(fd, "Rock and roll baby", sizeof("Rock and roll baby"));
close(fd);
unlink(myfifo);
int corpse;
int status;
while ((corpse = wait(&status)) > 0)
printf("Child %d exited with status 0x%.4X\n", corpse, status);
return 0;
}
reader.c
#include <fcntl.h>
#include <unistd.h>
#define MAX_BUF 1024
int main(void)
{
char* myfifo = "./myfifo";
int fd = open(myfifo, O_RDONLY);
if (fd < 0)
write(STDERR_FILENO, "Failed to open FIFO for reading\n",
sizeof("Failed to open FIFO for reading\n")-1);
else
{
char buf[MAX_BUF];
int nbytes = read(fd, buf, MAX_BUF);
if (nbytes > 0)
{
buf[nbytes-1] = '\n';
write(STDOUT_FILENO, buf, nbytes);
}
close(fd);
}
return 0;
}
Rock and roll baby
Child 43734 exited with status 0x0000
关于c - 对于带有 mkfifo 暂停的编写器文件可执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44642911/
我遇到了以下代码的问题: #include #include #include #include #include int main(int argc, char*argv[]){ FILE
我有一个不断需要写入信息的进程。此外,还有第二个进程有时会连接到写入进程的“信息 channel ”,并且应该读取连接后写入的信息。此过程也可能会再次断开连接并重新连接几次。 我目前通过在我的 C++
我的 C 程序中的以下行应提供 All/Group/Owner 读写权限 mkfifo("/tmp/dumbPipe", 0666) 但是一旦我执行了代码并检查了未设置写入位的权限,我最终得到了 pr
我正在尝试使用 mkfifo 命令在 linux 下的 c 上创建一个命名管道。但是当我运行该程序时,我要么收到“没有这样的文件或目录”错误,要么什么也没有(控制台不显示任何内容) 这是我的代码: #
#include #include #include #include #include #include #include int main(void) { if(mkfifo
据我了解,根据https://linux.die.net/man/3/mkfifo , 我得到一个暗示,我必须有读取器和写入器文件,才能 利用管道文件。下面的来源是编写器文件, #include #
我有以下代码,我从 Xcode 中的 Swift 主程序调用它,例如在虚拟 iPhone 的模拟器中运行它时,它可以工作。它创建/tmp/MYFIFO。 int32_t init_udpC(void)
我在命名 Linux BASH、命名管道等方面相当陌生。我正在关注这篇文章中的一个例子: https://www.linuxjournal.com/content/using-named-pipes-
我正在编写一个脚本来设置机器环境。我有能力在机器上放置一个启动脚本,所以我试图在我的“工作站”机器上使用 unix 中的命名管道在线。 问题是,我无法控制这些机器何时可以联机。总共有 20 多台机器同
gcc (GCC) 4.7.2 c89 我正在使用管道 mkfifo。我有一个读者和一个作家。 我希望读者阻塞,直到文件中有内容。 有一个标志可以设置为非阻塞模式的 O_NONBLOCK。所以默认情况
我使用 mkfifo 创建命名管道。然后我使用下面的程序打开它。但是,程序卡在“fopen”行。这里有什么问题吗? int main(int argc, char** argv) { char* li
我想执行一个 bash 脚本来执行以下操作: 应用程序“ffmpeg”生成一个实时传输流 (.ts) 文件。我需要处理这个实时流(执行解复用等)。 现在我知道这必须通过 FIFO 来完成;但这是我的任
我正在使用命名管道来捕获另一个程序 (MATLAB) 中的外部程序 (wgrib2) 的输出。 MATLAB 代码如下,system()访问命令行以制作管道: system('mkfifo myfif
我已经尝试调试这个问题几个小时了,但我仍然卡住了...... 我在这段代码中遇到了“mkfifo”调用的段错误(它只是我整个代码的一部分,因为我认为其余部分与这里无关): #include "mark
我有一个动态加载的库,可以计算一个特殊值。我的程序需要访问该值(在 C 或 C++ 中)。我想到了命名管道。但他们对于这个目的似乎有些奇怪。如果通过管道实现,我的库会在文件中写入一个值,然后我的程序会
我正在尝试用 C 创建命名管道,但没有成功。 这是我的代码: pid_t pid = getpid() ; char * pipeNameo = malloc( sizeof(char) * 100
我正在尝试用 C 创建命名管道,但没有成功。 这是我的代码: #define FIFO_NAME "/tmp/myfifo" int main(){ int fd; fd = mkfi
我正在尝试编写两个使用 fifo 管道相互通信的程序。我使用了例子here (第 5.2 节),但我将那里的 mknod 更改为 mkfifo 并尝试将 gets 更改为 fgets。这是代码(写入
我试图用 FIFO 做一些简单的事情:读取行,但不是一次全部读取,结果出乎意料地“不起作用”。 没关系: $ f=$(mktemp -u) $ mkfifo $f $ { seq 5 > $f; }
我使用 mkfifo 创建命名管道。然后我用下面的程序打开它。但是,程序在“fopen”行挂起。这里有什么问题吗? int main(int argc, char** argv) { char* li
我是一名优秀的程序员,十分优秀!