【问题标题】:Execute a bash command from a string in C (without system)从 C 中的字符串执行 bash 命令(无系统)
【发布时间】:2014-05-25 11:59:27
【问题描述】:

正如标题所说,我有一个字符串,其中包含由输入给出的 bash 命令(例如,command="ls -l"),我需要从 C 程序中执行它。 我知道我可以简单地使用系统(命令),但这是一个学校练习,我不能使用系统,也不能使用 popen。 我考虑过使用 exec*,但它需要解析字符串以分隔命令和各种参数。 是否有系统调用(不是系统)允许我简单地执行带有参数的命令而不必将它们分开? 提前感谢您的回答:)

【问题讨论】:

  • 不,重点应该是学习使用fork()。练习要求同时执行 n 个 bash 命令。但是我的教授说 system() 会导致很多安全问题,所以我们应该学会避免它......无论如何,如果我没有找到其他任何东西,我在进行字符串解析时没有问题......我只是想找到一个更“优雅”的解决方案:D

标签: c linux bash


【解决方案1】:

首先,这不是“bash”命令。 bash 是一个 shell,但是你有一个程序命令行。

您应该查看系统调用

  • fork – 用于创建新进程
  • execve – 用于将进程映像替换为来自不同二进制文件的程序。
  • waitpid - 用于等待分叉进程的终止

为了让您抢先一步,以下是您在不调用 system(…) 的情况下从程序启动 shell 的方法:

pid_t spawnshell(void)
{
    char *argv[]={"/bin/sh", 0};
    char *envp[]={0};

    pid_t shpid = fork();
    if(!shpid) {
        execve(argv[0], argv, envp);
        perror("execve");
        assert(0 && "execve failed");
        _exit(-1);
    }

    return shpid;
}

【讨论】:

  • waitpid在哪里?
  • @ErikAigner:其他地方。上述函数的目的是将shell作为进程启动,而不是等待它退出。
【解决方案2】:

这是一种在不解析命令及其各种参数的情况下执行命令的方法:

execl("/bin/sh", "/bin/sh", "-c", "your-command-without-parsing", 0);

【讨论】:

  • 伙计,太棒了!像魅力一样工作......顺便说一句,它是如何工作的?我不明白您为什么将“/bin/sh”作为第二个参数传递。另外,最后一个参数不应该是零吗?
  • 你是对的,最后一个参数必须是零。至于第二个arg,可以看一下execl的描述:linux.die.net/man/3/execl。或者看看stackoverflow.com/questions/12596839/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2021-09-07
相关资源
最近更新 更多