execv,等待,Unix编程,如何等待孩子
嗨我正在研究一个unix shell,我遇到了两个问题。我想知道你们中的任何一位能否帮助我。我的第一个问题是shell不在等待子进程终止。我实际上可以在子进程运行时输入更多的命令。我的第二个问题在于以下两行。我没有在shell上显示任何内容。execv,等待,Unix编程,如何等待孩子
fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
fprintf(stderr, "Child pid = %d\n", pid);
我有以下方法来执行由用户输入的方法:即火狐,LS -a等
void execute(char *command[], char *file, int descriptor){
pid_t pid;
pid = fork();
if(pid == -1){
printf("error in execute has occurred\n");
}
if(pid == 0){
execvp(*command,command);
fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
fprintf(stderr, "Child pid = %d\n", pid);
wait(&status);
exit(EXIT_SUCCESS);
}
else{
printf("ignore for now\n");
}
}
这是我所说的执行命令。它工作正常,并启动一个进程,但它不会等待它完成。
execute(commandArgv, "STANDARD",0);
你们有什么想法我可能做错了吗?谢谢,我非常感谢您随时为我提供帮助。
一旦execvp()运行,它将永远不会返回。它将内置的运行应用程序替换为提供的内容。所以你的fprintf()和wait()在错误的地方。
重新阅读您的问题......也许您只需要调用system()来运行您的命令?或者你是否特意要fork + execvp? – 2009-09-23 18:30:09
是的我需要fork然后execvp – user69514 2009-09-23 19:20:07
除了让实际的逻辑正常工作(Stéphane的建议一切正常)之外,您可能还希望在fprintf-ing之后使用(stderr),以确保您的错误消息立刻出来而不是被缓冲。
你在过程的工作方式上有点小错误。 execvp被调用后,没有回头路。 fork()让你有父母和一个完全相同的孩子,但是execvp覆盖子图像是你所调用的命令。
仅当发生严重错误以防止覆盖图像时,execvp 才会返回。所以,你需要在打电话前打印东西。因此,您也可能希望将EXIT_SUCCESS更改为EXIT_FAILURE。
现在还有一个错误,使用等待:你总是希望父母等待孩子,而不是其他的方式。你不能要求孩子等待。她没有什么可以等待,她会跑步和终止。因此,您需要将等待()呼叫移动到其他部分。
void execute(char *command[], char *file, int descriptor)
{
pid_t pid;
pid = fork();
if(pid == -1)
{
printf("fork() error in execute() has occurred\n");
return; /* return here without running the next else statement*/
}
if(pid == 0)
{
fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
fprintf(stderr, "Child pid = %d\n", getpid());
execvp(*command,command);
fprintf(stderr, "Error! Can't overwrite child's image!\n");
exit(EXIT_FAILURE);
}
else
{
printf("Parent waiting for child pid: %d\n", pid);
wait(&status);
printf("Parent running again\n");
}
}
但读你的问题,也许你实际上不希望父母等待。如果是这样的话,就不要使用wait()函数。
保重, 贝乔
编辑:一些小错误。孩子的pid是getpid()
我在执行调用后移动了等待。这工作得很好。谢谢。 – user69514 2009-09-23 19:02:12
或将其移动到代码的“忽略现在”部分,这是父级在fork()'d后执行的部分。 – 2009-09-23 19:03:52