- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的程序及其两个子进程都以有序的方式从标准输入读取输入。我发现的问题是:
鉴于此输入:
32
51453a
140
父进程读到32,也就是说第一个子进程需要再读2个数。父进程然后通过管道发送 1 个字节,向第一个进程发出信号,它需要读取两个数字。当子进程接收到信号并开始读取这些数字时,子进程读取的不是 51453a 和 140,而是 32 51453a。
我一直在努力理解为什么会发生这种情况,如何解决或更好,如何避免这种情况。
我在 Mac OSX 上运行
编辑:此问题仅在从文件重定向输入(运行 ./polygon < in.txt)时发生。当直接从控制台运行时,它不会发生。还添加了更多代码以提供更好的画面。
void runWriterProcess(char *outFile, int writerFd[2]) {
close(writerFd[1]);
close(STDIN_FILENO);
dup(writerFd[0]);
close(writerFd[0]);
char *const params[] = {"./writer", outFile, NULL};
execv("./writer", params);
}
void reader32(int INSIG, int OUTPUT) {
long unsigned polygonParts[2];
char runSignal[2], polygonBuffer[17];
int64 nextPolygon;
while(read(INSIG, runSignal, 1) > 0) {
scanf("%lx", &polygonParts[0]);
scanf("%lx", &polygonParts[1]);
nextPolygon = polygonParts[1];
nextPolygon = nextPolygon << 32;
nextPolygon += polygonParts[0];
sprintf(polygonBuffer, "%16llx", nextPolygon);
write(OUTPUT, polygonBuffer, (int)strlen(polygonBuffer));
}
finishError("reader32\0");
exit(EXIT_SUCCESS);
}
void reader64(int INSIG, int OUTPUT) {
char runSignal[2], polygonBuffer[17];
int64 nextPolygon;
while(read(INSIG, runSignal, 1) > 0) {
scanf("%16llx", &nextPolygon);
sprintf(polygonBuffer, "%16llx", nextPolygon);
write(OUTPUT, polygonBuffer, 16);
}
finishError("reader64\0");
exit(EXIT_SUCCESS);
}
void runMainLoop(int reader32, int reader64, int readPipe) {
long unsigned dummy[2];
int64 bigDummy, nextPolygon;
char polygonBuffer[17];
int readerToRun;
for(;;) {
scanf("%d", &readerToRun);
if (readerToRun == 32) {
write(reader32, "1", 1);
} else {
write(reader64, "1", 1);
}
read(readPipe, polygonBuffer, 16);
sscanf(polygonBuffer, "%16llx", &nextPolygon);
if(runOnPolygon(nextPolygon)) break;
}
write(reader64, "0\n", 2);
}
void createReaders(pid_t *reader32pid, pid_t *reader64pid) {
int fd32[2], fd64[2], fdBoth[2], readerToRun;
long unsigned polygonParts[2];
int64 nextPolygon, dummy;
char runSignal[2], polygonBuffer[17];
polygonBuffer[16] = '\0';
pipe(fd32);
pipe(fd64);
pipe(fdBoth);
if ((*reader32pid = fork()) == 0) {
close(fd32[1]);
close(fd64[0]);
close(fd64[1]);
close(fdBoth[0]);
reader32(fd32[0], fdBoth[1]);
}
if ((*reader64pid = fork()) == 0) {
close(fd32[0]);
close(fd32[1]);
close(fd64[1]);
close(fdBoth[0]);
reader64(fd64[0], fdBoth[1]);
}
close(fd32[0]);
close(fd64[0]);
close(fdBoth[1]);
runMainLoop(fd32[1], fd64[1], fdBoth[0]);
close(fd32[1]);
close(fd64[1]);
wait(NULL);
wait(NULL);
finishError("main_process\0");
}
void finishError(char processName[13]) {
char output[50];
sprintf(output, "%s pid=%d is going to exit\n", processName, getpid());
write(STDERR_FILENO, output, strlen(output) + 1);
}
int main(int argc, const char *argv[])
{
polygonList.head = NULL;
polygonList.tail = NULL;
pid_t writerPid, reader32pid, reader64pid;
int writerFd[2];
char outFile[11];
scanf("%s", outFile);
pipe(writerFd);
if (fork() == 0) {
runWriterProcess(outFile, writerFd);
} else {
close(STDOUT_FILENO);
dup(writerFd[1]);
close(writerFd[0]);
close(writerFd[1]);
createReaders(&reader32pid, &reader64pid);
}
freeList();
return 0;
}
最佳答案
这叫做缓冲。当您fork
时,子进程几乎是父进程的完整副本,包括输入缓冲区等内容。
最好的解决方案 (IMO) 是不从 child 的标准输入中读取。而是让父进程完成所有输入,然后通过管道将其发送给子进程。
关于c - scanf from child 扫描任何 parent 已经扫描过的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47927400/
这个fn是吗: function isplainobj ( obj ) { return Object.prototype.toString.call( obj ) === "[object
我尝试创建一个我没有经验的小 bash 脚本。我尝试做类似的事情: #!/bin/bash statut="na" if [ $proc = 0 ]; then statut = "close
我想重写 HighLine 的几个方法来自定义我的控制台,目前我的代码如下所示: cmd = ask("#{@prompt_label} #{@prompt_separator} ",
鉴于下面的 HTML,我尝试使用 jQuery 来匹配所有具有类“foo”的跨度的列表项,并且该跨度应包含文本“relevant”。 Some text relevant Some more
我拥有一个 5 美元 20GB SSD Digital Ocean Droplet,它几乎用完了 Docker 镜像和容器的空间。 有没有办法购买一个卷,将其连接到服务器并安全地将所有 Docker
我有这样的表: id name number result stuff stuff stuff stuff 我只想将 class = "red" 添加到
我需要计算两点之间的距离,但不是以常规方式。我需要知道“东西距离”+“南北距离”。我想这比常规的“乌鸦飞翔”计算更简单,但我仍然不知道如何做到这一点。 我想使用 MySQL 查询来执行此操作,并且最好
#include #include #include typedef struct dict_pair { void *key; void *value; struct dict_p
为什么当我尝试通过 将 char[] word 写入控制台时会发生这种奇怪的事情 Console.WriteLine(word); 我得到了一个正确的结果,但是当我写的时候 Console.Write
一个简单的例子: class C{} class B{ @Inject C c; void doSomething(){ System.out.println(c);
我想做某事,但不确定如何描述它。我有这门课 public class Company { private List _persons; private Person GetPersonByNa
我正在尝试实现我自己的 qDebug()样式调试输出流,这基本上是我目前所拥有的: struct debug { #if defined(DEBUG) template std::os
所以我正在为我的应用程序编写一个搜索功能,代码如下: - (void) selectObject: (NSString *)notes{ [axKnotes removeAllObjects]
我想在 Rust 中匹配一种复杂的继承式东西: struct Entity { pub kind: EntityKind, } pub enum EntityKind { Player
我是 SQL 新手。这没有返回任何结果...... SELECT media.id as mediaid, media.title as mediatitle, media.description
在微型 SDCard 上写入 Android things 图像并将该卡插入 Raspberry Pi 3 Model B 并打开电源,启动时显示“Auto config Please wait”然后
这是一个常见的但是文本出现在框的右侧,不是极右但几乎是这样 h3: ................................................ .................
#include #include #include #include #include int main(int argc, string argv[]) { if(argc >
所以我试图让一些东西相互堆叠。首先,查看工作链接会有所帮助,您会看到问题所在: http://brownbox.net.au/clients/matchlessphotography/ 现在我需要使用
我想在禁用 javascript 时在我的网站顶部显示一条消息(就像在 SO 上一样),但在谷歌浏览器上不起作用 最佳答案 看起来是这样。 您可以使用 javascript 隐藏“noscript”消
我是一名优秀的程序员,十分优秀!