gpt4 book ai didi

C - stackdump,带有多个 fork+redirect+exec 的奇怪输出

转载 作者:行者123 更新时间:2023-11-30 19:25:08 30 4
gpt4 key购买 nike

我有一个 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/

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