Waiting for execvp in main

旧街凉风 提交于 2019-12-24 18:58:42

问题


int main()
{
    ...
    if(!fork())
        {
            execvp(cmdName,cmdParam);
        }
    printf("In main()...");
return(0);
}
  1. Assuming I have correctly passed the cmdName & cmdParam arguments, how do I wait for the process created by execvp to finish, before resuming the execution of main()?
  2. Does the execvp() create a process which is a child of the newly fork()ed process?

回答1:


  1. In the parent process, fork returns the PID of the child process, so you can store that in a variable, and then use waitpid to wait for the child process to terminate.

  2. Not really - the new child process created by fork is a duplicate of the parent, and execvp then replaces its process image with a new image. Effectively you initially have two 'copies' of the parent, one of which then 'becomes' the new program.




回答2:


As noted you need to save the value of the fork call. You should really use more than an if on the fork. There are three cases:

  1. 0: you're the child process
  2. 0: you're the parent and got a child PID back

  3. -1: something horrible happened and fork failed

You really want to know about case 3, it'll ruin your whole day. (also the exec call)

int main() {
  int pid = fork();
  if(-1 == pid) {
     fprintf(stderr, "Big problems forking %s\n", strerror(errno);
     exit(-1);//or whatever
  }
  else if (0 == pid) {
    if (-1 == execvp(cmdName,cmdParam)) {
      //like above, get some output about what happened
    }
  }
  //no need to else here, execvp  shouldn't return 
  // if it does you've taken care of it above
  waitpid(pid, NULL, 0);
  printf("Resuming main()...");
}

return(0); }




回答3:


For your first question:

Use waitpid(2) like this:

int pid = fork();
if (!pid)
  {
    execvp(cmdName, cmdParam);
  }
waitpid(pid, NULL, 0);
printf("Resuming main()...\n");

For the second part: all exec function calls take the process over (none of them return)




回答4:


You need to store the return value of fork(), which returns a different value to each executable (0 if you are the child PID if you are the parent), and then you need to do a waitpid



来源:https://stackoverflow.com/questions/3637973/waiting-for-execvp-in-main

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!