这个问题已经有了答案:
Does the C execv() function terminate the child proccess?
4个答案
Differences between fork and exec
9个答案
我的任务是编写一个简单的linux shell。我在执行外部命令。我们需要使用execv。

for (int i = 0; i < count; i++){
  char path[1024];
  strcpy(path, PATHS[i]);         // PATHS is an array of cstrings, the paths in $PATH
  strcat(path, "/");
  strcat(path, command[0]);       // command and commands are essentially the same
  printf("%d %s",i,path);         // they are essentially argv[]
  if (!execv(path, commands))     // for ls -l $HOME
    break;                        // commands[0] = ls [1] = -l [2] = my home dir

现在我只是用LS测试。ls运行正常,但execv成功后程序立即关闭。有没有办法让我继续使用execv来检查正确的路径,并在execv成功后继续运行程序?

最佳答案

函数的exec family不会终止进程。它们替换现有的进程映像和执行的映像。
基本上,它的工作原理是,这个进程(带有它的pid和相关的内核资源)保持不变,只是旧映像中的所有代码都被删除,并被程序中的代码替换,然后加载到内存中并初始化,就好像它是一个新进程一样。pid不会改变,因此如果要创建具有自己的pid的子进程,则必须使用另一个函数。
正确的方法是先fork,然后从子进程中使用exec*。这样,您就可以在父实例中使用wait函数来等待子实例终止并恢复控制。

+--------------+             +--------------+                             +----------------------+
|Parent process|+---fork()-->|Parent process|+---------wait()------------>|Parent process resumes|
+--------------+      +      +--------------+                             +----------------------+
                      |                                                               +
                      |                                                               |
                      |                                                               |
                      |      +-------------+              +-----------------+         |
                      +----->|Child process|+--execv()--->|New process image|+--exit--+
                             +-------------+              +-----------------+

关于c - 如何防止execv杀死我的程序? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21452029/

10-11 18:49