【问题标题】:Why any thing that comes after execvp or the exec* family of functions will not be executed?为什么 execvp 或 exec* 系列函数之后的任何东西都不会被执行?
【发布时间】:2016-05-19 15:13:10
【问题描述】:

所以我知道exec* 函数之后的任何内容都不会被执行(当然,如果 exec* 调用成功的话)。

我想了解为什么会这样? 所以我开发了这个小小的程序

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

    printf("A program made to understand execvp\n");
    char *cmd[4] = {"ls", "-l","file",NULL};
    execvp(cmd[0],cmd);
    printf("This will not be printed!!\n");

    return 0;
}

我所理解的是,在 bin 目录中找到的可执行命令实际上是可执行程序,因此基本上从我们的程序中调用另一个程序时。

我确实在某个地方读到过

如果成功,exec 系统调用不会返回调用程序,因为调用图像丢失。

但这究竟意味着什么,为什么他们不返回调用程序?那他们怎么回来呢?

【问题讨论】:

  • 引用:The exec family of functions **REPLACES** the current process image with a new process image。换句话说,完全按照书面方式工作。
  • man exec 中的第一行解释了这一点:“exec() 系列函数用新的进程映像替换当前进程映像。”.
  • 因为 exec 系列函数替换您的代码与它加载的代码。
  • 返回什么?调用exec() 的代码是GONE。它不再在内存中,所以没有什么可以返回的。
  • 去年 10 月,stackoverflow.com/questions/32899582/… 是不是你问了同样的问题?

标签: c shell process exec execvp


【解决方案1】:

您说“基本上从我们的程序中调用另一个程序”,但这并不完全正确。

如果你想在你的程序中调用另一个程序,你可以使用system()

但是如果您使用exec 系列,他们所做的就是用另一个程序替换您的程序。用另一个程序破坏你的程序。用另一个程序覆盖您的程序。

一旦exec 成功地用另一个程序覆盖了您的程序,您的程序就没有任何痕迹可以返回。

这都是因为进程的概念。当你调用system()时,它会创建一个新的进程供该其他程序运行,当其他进程退出时,它可以在原始进程中返回到您的原始程序。

但是exec 不会创建新进程——它会重用原来的进程。

【讨论】:

  • 那么我的程序如何终止,或者在这种情况下,当 exec 终止时,它也只是终止我的程序?
  • @Pro:想象你是一台计算机,你的程序是你正在阅读的一本书。打电话给exec 就像把你的书扔到壁炉里,但马上用你从头开始阅读的另一本书替换它。
  • 调用exec 会有效地终止您的程序——尽管持有您的程序的进程仍然存在。新程序在旧进程中运行。当新程序退出时,进程终止。
  • 对于那些熟悉 BASIC 的人来说,execsystem,就像 GOTOGOSUB
  • @2501:是的,exec 中保留了一堆杂项进程状态:打开的文件、忽略的信号、uid/gid、“nice”级别、某些功能/特权等。
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多