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); 

你们有什么想法我可能做错了吗?谢谢,我非常感谢您随时为我提供帮助。

+0

我在执行调用后移动了等待。这工作得很好。谢谢。 – user69514 2009-09-23 19:02:12

+0

或将其移动到代码的“忽略现在”部分,这是父级在fork()'d后执行的部分。 – 2009-09-23 19:03:52

一旦execvp()运行,它将永远不会返回。它将内置的运行应用程序替换为提供的内容。所以你的fprintf()和wait()在错误的地方。

+0

重新阅读您的问题......也许您只需要调用system()来运行您的命令?或者你是否特意要fork + execvp? – 2009-09-23 18:30:09

+0

是的我需要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()