我有一个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
传递给execve
中的所有3个program1
呼叫,然后一切正常(将所有3个重定向的输入都复制到3个输出文件符合预期)。
如果我将simpleWrite
传递给一个孩子(例如第3个孩子)并从终端运行./program1
,则系统完成,第1个和第3个子进程按预期工作。第二个输出为空,最后我的目录中有一个文件"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个孩子按以下步骤执行:-儿童A-儿童B-儿童C
但是调度程序可能以不同的顺序执行它们。比方说A-C-B。
我希望这会有所帮助。