- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 C 程序(我们称之为“progam1
”)以及 3 个输入文件(例如 “in1.txt”、“in2.txt”、in3.txt”
)和 3 个最初为空的输出文件(“out1、”out2”、“out3”
),表示对各种多边形的操作。
从 progam1::main
中,我调用 fork 3 次,并且在每个子进程中,我使用 dup2
将标准输入/输出重定向到输入/输出之一输出文件,然后调用 execve("helper",...),其中 helper
是另一个 C 程序,用于解析输入、执行一些计算并打印输出。
我似乎无法解决的问题是,每当我多次调用 execve(helper,...)
时,第一次调用就可以正常工作(输入/输出正如我所期望的那样) ),但随后出现了问题;我似乎要么最终得到文件 helper.exe.stackdump
,要么系统不断将相同的数据打印到输出文件,或者出现其他意外结果。
作为实验,我编写了另一个 C 程序 - “simpleWrite.c”
,它只是将输入复制到输出。我使用 cygwin 运行所有这些程序。
如果我将 simpleWrite
传递给 program1
中的所有 3 个 execve
调用,然后一切正常(所有 3 个重定向输入都复制到3 个输出文件(如预期)。
如果我将 simpleWrite
传递给一个 child (比如第三个 child )并从终端运行 ./program1
,则系统完成,第一个和第三个子进程按预期工作。第二个输出是空的,我的目录中最终有一个文件 "helper.exe.stackdump"
。
如果我只将 helper
传递给所有 3 个子执行程序并从终端运行 ./program1
,那么系统永远不会完成。当我检查输出文件时,一个输出符合预期,一个输出为空,一个输出无限多次打印正确的数据。
谁能解释一下可能发生了什么!?或者解释什么是 stackdump 文件以及如何检查它,或者建议我如何解决这个问题?
以下是我的代码的总体思路:
//program1.c
#define INPUT1 "in1.txt"
#definte OUTPUT1 "out1.txt"
// same for rest of input/output files
char* my_argv[2];
int main(int argc, char* argv[])
{
char prog_name[20] = "helper";
char prog_name2[20] = "simpleWrite";
my_argv[0] = "helper";
my_argv[1] = NULL;
pid_t pid1, pid2, pid3, pid;
int status;
if ((pid1 = fork()) < 0) {
printf("Failed to fork process 1\n");
exit(1);
}
else if (pid1 == 0)
{
// redirection here for the child only
int fd_in = open_file_desc(INPUT1);
int fd_out = open_file_desc(OUTPUT1);
dup2(fd_in, 0);
dup2(fd_out,1);
close(fd_in);
close(fd_out);
execve(prog_name, my_argv, NULL);
//alternately, execve(prog_name2, my_argv, NULL);
}
if ((pid2 = fork()) < 0) {
//...
}
else if (pid2 == 0)
{
int fd_in2 = open_file_desc(INPUT2);
int fd_out2 = open_file_desc(OUTPUT2);
...// same idea as above
}
// likewise for pid3
...
//back in parent process
pid = wait(&status);
printf("\n***Parent detects process %d was terminated ***\n", pid);
pid = wait(&status);
printf("\n*** Parent detects process %d was terminated ***\n", pid);
pid = wait(&status);
printf("\n*** Parent detects process %d was terminated ***\n", pid);
// dup2(sav_stdin, 0);
// dup2(sav_stdout, 1);
// dup2(sav_stderr, 2);
exit(0);
}
//helper.c
enum POLYGON { HEXAGON = 6, HEPTAGON = 7, OCTAGON = 8 };
struct point {
short *X, *Y;
};
struct polygon
{
enum POLYGON type;
struct point points;
};
struct Node {
struct polygon* poly;
struct Node* next;
};
struct Node *HEAD = NULL;
struct Node *TAIL = NULL;
int main()
{
int lastCommand = 0, polygonscreated =0, newPolygonBit;
//other variables needed for parsing/calculations
while (!lastCommand)
{
scanf("%llx", &input);
//parsing stuff
if (newPolygonBit == 1)
{
polygonscreated = polygonscreated+1;
scanf("%llx", &setOfPoints1);
scanf("%llx", &setOfPoints2);
struct polygon* polyptr = createPolygon(polyType, setOfPoints1, setOfPoints2);
func[ADD_POLYGON](polyptr);
}
lastCommand = input & 1;
}
freeList(HEAD);
printf("Created %d polygons", polygonscreated);
return polygonscreated;
}
//simpleWrite.c
int main()
{
char c;
while( read(0, &c, 1) > 0){
write(1, &c,1);
}
return 0;
}
最佳答案
我使用类似的代码也遇到了类似的问题。
我的问题是我希望我的子进程按特定顺序执行。在这种情况下,假设您希望您的 3 个 child 执行如下:- child A- child B- child C
但是调度程序可能会以不同的顺序执行它们。让我们说 A-C-B。
希望这能有所帮助。
关于C - stackdump,带有多个 fork+redirect+exec 的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59271748/
在下面的代码中,我在 python 模块代码中使用了 try/catch。在 try block 中,我有一个简单的错误(内存访问冲突)并试图捕获相应的异常并安静地终止程序而不生成 .stackdum
这个问题很可能是 Using a stackdump from Cygwin executable 的重复问题- 但我是初学者,我不明白答案,甚至部分问题。 我是 C++ 和编程的新手,我正在使用 N
我是 cygwin(和 linux)的新手。 当我尝试运行基于 C 语言的可执行文件时,发生了段错误,并且我获取了 stackdump 文件。但是,我不知道如何使用它进行调试。 我一直在寻找如何使用
当我使用 MinGW make 的 unix 实用程序时,我得到一个 StackDump 文件: 错误: sed -i -e 's/reveal.js\/css\/theme\/simple.css/
如果我执行以下代码,则会出现此堆栈转储错误消息: 1 [main] MyProg 10876 cygwin_exception::open_stackdumpfile: Dumping stack t
我有一个应用程序有时会崩溃并创建下一个文件:(APP.exe.stackdump) Exception: STATUS_ACCESS_VIOLATION at eip=6BA4B246 eax=674
我收到“cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 TestProject.exe.stackdump”错误。我的项目只不过是一个 C++ HalloW
我有一个 C 程序(我们称之为“progam1”)以及 3 个输入文件(例如 “in1.txt”、“in2.txt”、in3.txt” )和 3 个最初为空的输出文件(“out1、”out2”、“ou
这是我在 Airport.cpp 中的主要内容: #include #include "Airport_Queue.h" #include "Airplane.h" #include int ma
在 eclipse cdt 上以 Debug模式运行我的应用程序后,我尝试了以下命令并通过生成文件 TestC++.exe.stackdump 进行了 segmentation gdb ./Debug
我是 Git 的新手,对“stash ”命令有疑问。 当我写“git stash”、“git stash list”、“git stash apply”、“git drop”等命令时,我总是得到一个名
我是动态内存分配的新手,我尝试编写一个简单的程序来连接 2 个字符串(一个已初始化,一个从标准输入读取),第一个字符串使用 realloc。但是我收到这个错误: cygwin_exception::o
#include #include #include #include #include #include #include using namespace std; struct no
我是一名优秀的程序员,十分优秀!