【问题标题】:Execute shell program with execv使用 execv 执行 shell 程序
【发布时间】:2017-04-03 17:11:46
【问题描述】:

我正在用 C 语言编写一个包含这些行的程序:

void main(int argc, char *argv[]) {
    char* file=argv[1];
    char* arguments[] = { "sh", argv[2], argv[3], argv[4], file, NULL };
    execv("/bin/sh", arguments);  
}

文件是prog.sh,其中包含一个简单的参数总和:

expr $1 + $2 + $3

当我通过./main prog.sh 1 2 3 运行程序时,我得到一个错误

/bin/sh: 0: Can't open 1

虽然我期望输出 6(1 2 3 的总和)

【问题讨论】:

  • 这段代码你编译了吗?进入expr 可执行文件。它看起来非常尴尬。你有一个 shell 脚本,调用一个正在调用 shell 脚本的可执行文件,调用可执行文件......它不会和平结束。
  • 当我从终端运行 (sh prog.sh 1 2 3) 时,它可以工作。不,我只有一个调用 shell 脚本的 C 程序 :)
  • main 到底是什么?
  • 我的主程序!
  • 在C中,main()的返回类型必须是int,而不是void

标签: c shell exec


【解决方案1】:

看看你的论点:

char* arguments[] = { "sh", argv[2],argv[3],argv[4],file, NULL };

当您运行./main prog.sh 1 2 3 时,您最终会调用:

sh 1 2 3 prog.sh

您应该将脚本作为第一个参数:

char* arguments[] = { "sh", file, argv[2],argv[3],argv[4], NULL };

因此调用

sh prog.sh 1 2 3

【讨论】:

  • 我想知道为什么"sh" 后面不需要"-c"。花了一些时间试图让它与"-c"一起工作。
  • @VictorSergienko -c 用于当您想要评估字符串中的 shell 代码时。如果你想在文件(又名脚本)中评估 shell 代码,不要使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2023-03-24
  • 2014-03-16
相关资源
最近更新 更多