如何让execv不要杀死我的程序?

时间:2014-01-30 09:12:17

标签: c linux execv

我的任务是编写一个简单的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成功后继续运行?

2 个答案:

答案 0 :(得分:4)

exec family函数不会终止您的进程。他们将现有流程图片替换为图片

基本上,它的工作原理就是,该进程(以及它的PID和相关的内核资源)保持不变,除了旧映像中的所有代码都被删除并被程序中的代码替换,然后加载到内存中初始化就好像它是一个新进程一样。 PID不会更改,因此如果要创建具有自己的PID的子进程,则必须使用其他函数。

正确的方法是首先fork,然后使用子进程中的exec *。这样,您可以使用父实例中的wait函数来等待子进程终止并重新获得控制权。

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

答案 1 :(得分:2)

各种形式的exec()实际上用当前的过程映像替换。它们不会产生新的进程。所以你需要自己使用fork()。