有没有比system()更多的方法来执行二进制文件

时间:2013-08-06 18:35:00

标签: c linux

我在Linux上开发了一个C代码,我想执行二进制文件/usr/sbin/binary_program -p xxx,是否有另一种方法而不是system()调用来执行二进制文件?

3 个答案:

答案 0 :(得分:5)

是的,一般来说,system永远不应该使用,至少出于以下原因:

  • 它遭受shell引用问题的所有危险,因此除了硬编码命令行之外的任何东西都有潜在危险。
  • 它不是线程安全的。
  • 它会干扰调用程序中的信号处理。
  • 除了退出状态之外,它无法从执行的程序获取输出,除非该命令明确地将输出保存到文件。

要执行外部程序,您应使用posix_spawnfork,然后使用其中一个exec - 系列函数。但是,如果可能的话,您应该避免依赖外部程序/命令,尤其是在程序中直接执行工作更容易且更不容易出错的情况下。例如,我看到过像system("sleep 1");而不是sleep(1);这样荒谬的用法。

答案 1 :(得分:3)

是的,您可以使用exec*系列功能。

http://pubs.opengroup.org/onlinepubs/9699919799/functions/execv.html

如果需要模拟system的行为,您可以fork然后调用exec函数。

system的POSIX page说:

  

system()函数的行为就像使用fork()创建子进程一样,子进程使用execl()调用sh实用程序,如下所示:

     

execl(< shell path>,“sh”,“ - c”,command,(char *)0);

答案 2 :(得分:2)

重要的是要意识到,您可以同时运行多个程序,并通过管道(或其他Inter Process Communication)进行通信。这通常是系统调用的混合物。

我强烈建议您阅读Advanced Linux Programming或其他一些好书,解释与我们所涉及的各种syscalls(2)相关的更多(我们可以在几分钟内完成),尤其是fork(2),{{ 3}},pipe(2)dup2(2)execve(2)和其他几个(也许waitpid(2)用于多路复用,例如以避免圆形管道中的死锁)。 system(3)函数构建在这些系统调用(和/bin/sh

之上

高级Linux编程一书中有一章专门讨论过程。

我还建议了解Unix命令shell的工作原理。通过研究一些简单的自由shell(如sash)的源代码或至少通过strace来研究它。

实际上,poll(2)popen(3)更有用。您可以获取配套命令的输出。

一些库(Poco,Qt,Glib / GTK)也具有强大的流程管理功能。

使用{em>棘手来了解fork创建新流程。使用execve在同一过程中启动新程序。

所有进程都是由fork(或者vfork)创建的,除了少数几个由内核神奇地启动(/sbin/init/sbin/modprobe,...)功能