我在Linux上开发了一个C代码,我想执行二进制文件/usr/sbin/binary_program -p xxx
,是否有另一种方法而不是system()
调用来执行二进制文件?
答案 0 :(得分:5)
是的,一般来说,system
永远不应该使用,至少出于以下原因:
要执行外部程序,您应使用posix_spawn
或fork
,然后使用其中一个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
,...)功能