2013-08-06 50 views
1

我在Linux上开发的C代码,我想执行一个二进制说/usr/sbin/binary_program -p xxx,有没有比system()呼叫执行二进制的另一种方式?是否有另一种方法比系统()执行二进制

+2

你看看'system'手册页底部开始奇迹般地查看“另请参阅”部分是否有任何内容? – Mat

+1

你希望通过使用'system()'以外的东西解决哪些缺陷? –

+0

如何使用dll共享对象并在运行时加载它? – 0x90

回答

5

是的,在一般情况下,system不应该被使用,至少这些原因:

  • 它从shell引用问题的种种危险遭遇,所以决不是一个硬编码的命令行是潜在的危险。
  • 它不是线程安全的。
  • 它会干扰调用程序中的信号处理。
  • 除非命令明确地将输出保存到文件,否则它不提供从执行的程序获取输出的方式,除了退出状态。

为了执行外部程序,你应该使用posix_spawn,或fork随后的exec - 家庭功能之一。但是,如果可能的话,应该避免依赖外部程序/命令,特别是在程序中直接进行工作时更容易且不易出错的情况下。例如,我已经看到了像system("sleep 1");而不是sleep(1);这样荒谬的用法。

+0

'system'的一个更有用的替换是'popen',但它仍然有一些相同的问题(如shell引用)。 –

3

是的,您可以使用exec*功能家族。

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

如果需要模拟的system行为可以fork然后调用exec功能。

的POSIX的systempage说:

系统()函数应行为,如果一个子进程使用fork()的创建和子进程使用execl的()如下调用SH工具:

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

+0

请注意,'system'是通过'fork'-ing和'exec'后来'/ bin/sh -c'工作的,这也是标准化的。 –

2

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

我强烈建议阅读Advanced Linux Programming,或其他一些好书解释了很多(比我们可以在几分钟内完成),对所涉及的各种syscalls(2),特别是fork(2)pipe(2)dup2(2)execve(2)waitpid(2)和其他几个人(也许poll(2)用于多路复用,例如以避免环形管道中的死锁)。该system(3)功能这些系统调用(和/bin/sh

高级Linux编程本书有专门处理一整章再建。

我还建议了解一个Unix命令shell是如何工作的。通过研究一些简单的免费外壳的源代码(如sash)或者至少通过strace来研究它。

实际上,popen(3)system(3)更有用。您可以获取伴侣命令的输出。一些库(Poco,Qt,Glib/GTK)也具有强大的过程管理功能。

一个新的过程是用fork创建的,这是棘手的了解。在execve的同一过程中启动一个新程序。

所有进程fork(或者vfork)创造除了一些少数内核(/sbin/init/sbin/modprobe,...)

相关问题