【问题标题】:running shell script using c programming使用 c 编程运行 shell 脚本
【发布时间】:2011-12-05 04:23:31
【问题描述】:

大家好,我想问我正在制作一个程序,我必须在其中使用 c 程序运行 shell 脚本。到目前为止,我已经分开了论点。我已经搜索过应该使用 exec 来运行 shell 脚本 但我完全感到困惑,因为 exec 有很多变体,通过阅读手册页我无法找到最合适的

同样在一些 exec 函数中,第一个 arg 是

路径

有些人有

指向文件的指针

有什么区别,我应该写什么来代替它。请指导我 谢谢

【问题讨论】:

  • exec 将用脚本替换您当前的程序。如果您希望程序继续运行,您应该使用system 进行同步执行,使用fork + exec 进行异步执行。
  • 是否选择 execve 或 exec 系列中的其他函数取决于您是否想要/需要使用路径、传入环境变量列表等。如果不这样做,请选择最简单的.

标签: c shell system exec


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>

#define SHELLSCRIPT "\
for ((i=0 ; i < 10 ; i++))\n\
do\n\
echo \"Count: $i\"\n\
done\n\
"

int main(void)
{
  puts("Will execute sh with the following script:");
  puts(SHELLSCRIPT);
  puts("Starting now:");
  system(SHELLSCRIPT);
  return 0;
}

参考: http://www.unix.com/programming/216190-putting-bash-script-c-program.html

【讨论】:

    【解决方案2】:

    所有exec* 库函数最终都是execve() 系统调用的便捷包装器。只需使用您认为更方便的那个即可。

    p 结尾的(execlp(), execvp())使用$PATH 环境变量来查找要运行的程序。对于其他人,您需要使用完整路径作为第一个参数。

    eexecle()execve())结尾的那些允许您定义环境(使用最后一个参数)。这样可以避免$PATH$IFS 和其他危险环境变量的潜在问题。

    名称中带有v 的那些接受一个数组来指定要运行的程序的参数,而带有l 的那些将要运行的程序作为变量参数接受参数,以(char *)NULL 结尾.例如,execle() 非常便于构造固定调用,而execv* 允许许多参数以编程方式变化。

    【讨论】:

      【解决方案3】:

      从 C 程序运行 shell 脚本通常使用

      #include <stdlib.h>
      int system (char *s);
      

      其中 s 是指向脚本路径名的指针,例如

      int rc = system ("/home/username/bin/somescript.sh");
      

      如果您需要脚本的标准输出,请查看 popen 手册页。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多