- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要编写具有如下结构的程序:
父进程创建 fifo,然后 fork()
fork()
我用一个 fork 创建了一个简单的程序, child 可以在其中与 parent 交流:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define FIFO "/tmp/my_fifo"
int main()
{
pid_t fork_result;
int pipe_fd;
int res;
char writer[3];
char reader[3];
res = mkfifo(FIFO,0777);
if (res == 0)
{
printf("FIFO created!\n");
fork_result = fork();
if (fork_result == -1)
{
fprintf(stderr, "fork error");
exit(EXIT_FAILURE);
}
if (fork_result == 0)
{
printf("CHILD 1\n");
pipe_fd = open(FIFO, O_WRONLY | O_NONBLOCK);
scanf("%s", writer);
res = write(pipe_fd,writer,3);
if (res == -1)
{
fprintf(stderr,"error writing fifo\n");
exit(EXIT_FAILURE);
}
(void)close(pipe_fd);
exit(EXIT_SUCCESS);
}
else
{
printf("PARENT\n");
pipe_fd = open(FIFO, O_RDONLY);
res = read(pipe_fd, reader, 3);
printf("reader: 0: %c\n",reader[0]);
printf("reader: 1: %c\n",reader[1]);
printf("reader: 2: %c\n",reader[2]);
(void)close(res);
}
}
else
{
printf("deleting fifo... run program again!\n");
unlink(FIFO);
}
exit(EXIT_SUCCESS);
}
而且效果很好。所以我创建了具有上述架构的代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define FIFO "/tmp/my_fifo"
int main()
{
pid_t fork_result;
pid_t fork_result2;
int pipe_fd;
int res;
char writer[3];
char reader[3];
res = mkfifo(FIFO,0777);
if (res == 0)
{
printf("FIFO created!\n");
fork_result = fork();
if (fork_result == -1)
{
fprintf(stderr, "fork error");
exit(EXIT_FAILURE);
}
if (fork_result == 0)
{
printf("CHILD 1\n");
pipe_fd = open(FIFO, O_WRONLY | O_NONBLOCK);
scanf("%s", writer);
res = write(pipe_fd,writer,3);
if (res == -1)
{
fprintf(stderr,"error writing to fifo\n");
exit(EXIT_FAILURE);
}
(void)close(pipe_fd);
exit(EXIT_SUCCESS);
}
else
{
printf("PARENt 1\n");
//don't forget pipe!
fork_result = fork();
pipe_fd = open(FIFO, O_RDONLY);
if (fork_result == 0)
{
printf("CHILD 2\n");
res = read(pipe_fd, reader, 3);
printf("Odczytano: 0: %c\n",reader[0]);
printf("Odczytano: 1: %c\n",reader[1]);
printf("Odczytano: 2: %c\n",reader[2]);
(void)close(res);
}
}
}
else
{
printf("deleting fifo\n");
unlink(FIFO);
}
exit(EXIT_SUCCESS);
}
运行顺序是这样的:
PARENT 1
CHILD 1
CHILD 2
因此,在父级 1 中,我打开 FIFO 进行读取,在子级 1 中,我正在写入 FIFO,子级 2 应该读取它。我的意思是在代码中,因为当我运行它时,我什至无法向 FIFO 写入任何内容。在 scanf("%s", writer);
中的 block 中,在第一个程序中工作。
我是否正确使用了open()
?我需要在某处使用 getpid()
吗?为什么当我尝试写入 fifo 时它会阻塞。
最佳答案
问题是 CHILD1 正在使用 O_NONBLOCK
打开 fifo,如果没有其他进程打开 fifo,它将失败(使用 EWOULDBLOCK
或 EAGAIN
) fifo 开放阅读。现在在第一个程序中,父进程继续在 fork 之后运行并在子进程开始并打开写端之前打开 fifo 进行读取,因此它可以工作。但在第二种情况下,父进程首先执行额外的 fork,这会减慢它的速度,使 CHILD1 在 PARENT 或 CHILD2 打开 fifo 进行读取之前到达其打开命令,因此 CHILD1 打开失败。
摆脱 O_NONBLOCK
并且它工作得很好(尽管您打开 fifo 以在 PARENT 和 CHILD2 中读取,这可能不是您想要的)。
如果你想从键盘读取,你还有另一个问题。如果从 shell 运行它,PARENT 将立即(或多或少)退出,因此 shell 将返回从键盘读取命令,这意味着 CHILD1 和 shell 将争夺输入。另一方面,如果您按照最初描述的方式进行操作,并让 PARENT 等待从 CHILD2 的管道中读取数据,那么它应该会按照您的意愿进行操作。
关于c - 命名管道和 fork 头痛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651997/
刚刚结束我的上一次冒险,现在我正在尝试映射更复杂的 URL 并疯狂地尝试使其按照 Spring 文档建议的方式工作。 同样,这些工具是: Java 1.6 Spring 3.2 MVC Tomcat
我找到了一些关于如何将用户构建的 .class 和 .jar 文件导入 JPype 的说明,但我似乎很难让任何东西正常工作。 有效方法:我可以导入标准的 java 内容并打印 HELLO WORLD
我已经浪费了几天时间试图追踪新添加的 Akka 传输加密中的间歇性错误。 注意:我已经尝试在服务器和客户端之一或两者上设置 setIssueHandshake(true) ,但它根本没有帮助。 我们的
我需要使用 PHP 从 PC 可靠地获取用户 ID。 我试过用 gethostbyaddr($_SERVER['REMOTE_ADDR']); 但这会返回 pc 的网络名称,而不是他们实际登录的名称。
我需要编写具有如下结构的程序: 父进程创建 fifo,然后 fork() child 1 从 stdin 读取消息并将其写入命名管道 (FIFO) 然后在父进程中我需要创建管道(未命名)和另一个 fo
GDB 开始让我头疼了。 GDB 的工作方式似乎有些奇怪。 obj/local/armeabi/包含项目中使用的所有未删除的 .so 文件的列表以及名为 objs-debug 的目录,其中包含一堆 .
我有一个分类网站。我正在使用 SOLR 来索引和存储数据。然后我还有一个 MySQL 数据库,其中包含一些关于我不存储或索引的分类的更多信息。 现在,我有一个非常规范化的数据库,其中包含 4 个表。
我正在使用 Javascript 对来自数据库的数据进行“mustache light”模板化。数据如下所示: As you can see in {{Figure 1-1}}, and again
我有一个 tableview,我创建了一个 segue 将它推送到另一个 View Controller 。时不时地,这个 segue 会在我不碰它的情况下中断,我可以保证。我什至没有编辑我放入的文件
我已经尝试找出一个问题大约 3 个小时了,我真的不明白为什么这个插件不起作用。有问题的插件称为 Blueberry,是一个使用 jQuery 的图像 slider 。 该插件在演示文件夹中完美运行(在
已更新! 我设法使用 PDT 获得动态收据,屏幕截图在这里:http://pastebin.com/4RcTdHKd这是从我的 pdt.php 生成的:http://pastebin.com/4RcT
所以让我首先说我已经遍历了我能找到的每一个问答,无论是在网站上还是在网站外,但我仍然碰壁。 我的程序: 我的程序所做的只是在与我的程序相同的目录中运行一个批处理文件。 代码是: try {
要么我错过了一些深藏在某些文档(Spring、Spring Boot、H2、HSQLDB、Derby、IntelliJ)中的核心概念,要么我已经盯着这个看太久了。 我有一个 Spring Boot 项
我的元素在 Chrome 中无法正常工作(鼠标悬停在图标上不起作用)。但是,firefox 显示正常。 http://i.stack.imgur.com/gpDHx.jpg Codepen 源代码 h
上下文与这个非常相似:Apple OSX OpenGL offline rendering with CoreGL . 我写了一个非常小的 C++/OpenGL 程序(我们实际上无法想象更简单),它应
我一直有类似的问题,但没有人解决我的问题。我正在 Web 服务器上运行一个 javascript 应用程序,该应用程序应该访问另一个子域中的 URL。浏览器是 Chrome 并且 CORS 总是在那里
我这辈子似乎无法以一种不会不时抛出随机错误的方式设置 rspec/capybara。我最常见的错误(但不一致)如下: An error occurred in an after hook Acti
我正在为一个 friend 开发一个网站,我在使用@font-face 实现字体时遇到了真正的麻烦 问题是字体确实与它创建的框内联。如果我制作一个 10 像素高的框,其中包含文本,文本会浮在它应该在的
我最近升级到 F24,现在在我的 R session 中,我无法加载一些包,sp。 reshape2、latex2exp、knitr 等。 我发现的最初问题是 F24 使用 libicu56,而这些包
经过八个多小时的搜索,我认输并为此创建了一个新问题。操作很简单,但我很难让它正常工作,似乎已经通过了所有其他解决方案。我需要两件事: 1.) 在整个文件中 PBS 的第一个匹配出现的行之前插入一行。它
我是一名优秀的程序员,十分优秀!