【问题标题】:Basic usage of execlp() in CC 中 execlp() 的基本用法
【发布时间】:2011-12-16 18:17:45
【问题描述】:

所以我得到了这个代码:

execlp("sh", "sh", "-c", string, (char*) 0);

在课堂上,并被告知要理解它。我一直在疯狂地查找 execlp API,但我仍然不完全理解这段代码在做什么。

我的最佳猜测: “sh”是文件路径

“-c”是参数

字符串是命令

(char*)0 是空终止符。

我似乎无法弄清楚为什么代码中有两个“sh”实例: 我猜测 -c 表示复制,并且该命令正在使用 string 命令执行从一个文件到另一个文件的复制,但我不是 100% 的。

任何澄清将不胜感激。 谢谢。

【问题讨论】:

  • 按照惯例,argv[0] 是可执行文件的名称。
  • 啊,好吧,所以“sh”将是可执行文件。那为什么“sh”代表两次呢?
  • 第一个参数是您执行的实际命令。后续参数填充 argv,从零开始。

标签: multithreading exec


【解决方案1】:

第一个参数是要执行的文件名(在本例中是 sh 命令)。它的第一个参数应该是可执行文件的名称(因此重复的“sh”),-c 是 sh exe 的另一个参数,告诉它从命令字符串中读取命令。 string 是(我猜)sh 应该执行的命令,而 (char *)0 只是一个结束标记。

如果我遗漏了您想要解释的内容,请告诉我。

【讨论】:

  • 哦,谢谢你,太好了。只是好奇:这个命令会创建一个新的进程映像,它会覆盖调用它的进程的进程映像,对吧?那么如果进程A调用这个execlp()命令来执行程序B,那么与程序B关联的进程会覆盖进程A吗?
  • 是的,任何执行 exec* 命令的进程都将被它尝试创建的进程替换。如果您想以这种方式生成一个新进程以保留进程 A,请使用 fork() 创建进程 B,然后在进程 B 的上下文中调用 exec(通过检查 fork() 返回值)
  • 啊,好吧。非常感谢!
猜你喜欢
  • 2023-03-05
  • 2016-09-22
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多