【问题标题】:execl in C programmingC语言中的execl
【发布时间】:2018-11-09 05:00:37
【问题描述】:

我有一个 C 程序。我注意到你不能在里面放 2 个 execl。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main()

{
      pid_t fork(void);

      int system(const char *command);

      execl("/bin/sh", "sh", "-c", "kdialog --warningcontinuecancel 
      \"Make sure to include: \n \n 1. py_lcd folder \n 2. 4x20 
      Raspberry Pi LCD Display \n 3. Python 2.7.12 to be installed \n 
      \n If you are missing something, kill the program process and 
      get them.\"", (char *) 0);

      sleep(1);

      execl("/bin/sh", "sh", "-c", "kdialog --msgbox \"Setting up files...\" --title \"Installing...\"", (char *) 0);
      return(0);
}

如果有办法绕过这个或者我犯了错误,有人可以帮助我吗???

【问题讨论】:

  • 如果 execl 成功,它不会返回。永远。
  • 显示的代码无法编译。避免使用反斜杠将字符串中的行粘贴在一起。使用字符串连接:相邻的字符串文字被编译器合并为一个,所以"abc" "-" "def"创建一个单独的字符串"abc-def",即使三个组件字符串在不同的行,中间有空行或cmets,没有任何必要对于任何反斜杠。例如,您可以使用"abc\n" "def\n" "ghi\n" 创建三行。
  • 为什么要把fork的声明放在本地?
  • @Jonathan Leffler “不编译”是什么意思?
  • @Antti Haapala 感谢您提供信息!我会研究一下,看看我能改进什么! :)

标签: c execl


【解决方案1】:

exec 系列函数在成功时不会返回。他们将正在运行的进程替换execed。如果你想在子进程中运行程序(完全控制,不像system),你需要使用fork + exec + wait(或者posix_spawn)。

【讨论】:

  • 好的,谢谢!我刚开始 C 编程,我爸爸一直在带我参观……我犯了很多错误,但我无法解决这个问题……
【解决方案2】:

在 execl 之后写的任何东西都是死代码。 execl 的主要目的是将当前进程信息重新用于新进程以提高性能。您将使用与执行 execl 的当前进程共享相同的进程信息结构(pid、堆栈、堆等)。

【讨论】:

  • 这并不完全正确。测试来自execl() 的返回值是没有意义的;如果返回则失败。但是如果代码确实无法执行程序,您应该有代码来打印适当的错误(可能),并且肯定有代码来确保子进程在失败时终止。 (好的:可能会有一些其他的错误恢复,但你需要仔细考虑,通常在execl()之后你有一个退出。)
  • 究竟哪一部分不正确?我认为这是关于死代码。如果是单个进程,则 execl 成功,如果没有代码来处理 execl 返回的错误,则在此之后放置代码是没有用的。
  • 你说“execl()之后写的任何东西都是死代码”;我不同意这种看法——我给出了原因(execl() 可以在失败时返回(但仅在失败时),然后您需要代码来处理该错误)。
【解决方案3】:

我自己找到了答案。有一个 system() 命令的工作原理完全相同,但您可以将其插入代码中的任何位置而不会出现问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    相关资源
    最近更新 更多