【问题标题】:C program that executes bash commands inside xterm with execl使用 execl 在 xterm 中执行 bash 命令的 C 程序
【发布时间】:2023-03-08 11:24:01
【问题描述】:

我有一个命令可以在 Linux 的普通终端中很好地执行:

xterm -e bash -c "some commands"

我想使用 c 程序 execXX 系统调用来执行上述命令。我尝试使用以下代码,但它给了我一个正常的 xterm 窗口。

execl("/usr/bin/xterm", "/usr/bin/xterm -e bash -c \"some commands\"", NULL);

有什么方法可以使用 execXX 系统调用来执行上述命令吗?谢谢!

【问题讨论】:

    标签: c linux exec system-calls


    【解决方案1】:

    你需要这样称呼它:

    execl("/usr/bin/xterm", "/usr/bin/xterm", "-e", "bash", "-c", "some commands", (void*)NULL);
    

    约定是让第一个参数与程序的路径相同。如果参数中有空格,则与调用xterm 'something with spaces' 而不是xterm something with spaces 的效果相同。

    【讨论】:

    • 请注意,最后一个参数应转换为void *NULL 否则只是 0,因为它是一个可变参数函数,它可能会推送一个比指针更小的零。
    • @Shahbaz,我花了一秒钟才明白你的意思。虽然在技术上是正确的,但我认为大多数 ABI 都会使这成为一个非问题。我认为必须有大量代码没有将NULL转换为(void *)。但据我了解,您是正确的。
    • 我不确定这是否真的不是问题。我没有看到它出错,但除非编译器明确知道 execl 最终期望 (void *)NULL (我认为 gcc 确实),否则它无法知道它应该推送 64 位零而不是 32 位(例如,在 64 位架构的情况下)。这意味着在非 gcc 编译器和非标准库函数上(除非您使用正确的 gcc __attribute__),这很容易成为问题。
    • @Shahbaz,嗯,是的。我认为 GCC 很好,可以将 NULL 扩展到 __nullptr。
    【解决方案2】:

    可能的切线:有什么理由需要这些在xterm 中专门运行?如果你只是想运行一些 shell 命令,那么在 /bin/sh/bin/bash 中运行它们会更自然,而且可能更可靠。

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2012-01-03
      相关资源
      最近更新 更多