C 除了system()之外,还有其他方法执行二进制文件吗
我在Linux上开发了一个C代码,我想执行一个二进制程序,比如说C 除了system()之外,还有其他方法执行二进制文件吗,c,linux,C,Linux,我在Linux上开发了一个C代码,我想执行一个二进制程序,比如说/usr/sbin/binary\u程序-pxxx,除了system()调用,还有其他方法执行二进制吗?是的,您可以使用exec*函数族 如果需要模拟system的行为,可以fork然后调用exec函数 系统的POSIX表示: system()函数的行为应与子进程是使用fork()创建的一样,子进程使用execl()调用sh实用程序,如下所示: execl(,“sh”,“-c”,命令,(char*)0) 是的,您可以使用exec*
/usr/sbin/binary\u程序-pxxx
,除了system()
调用,还有其他方法执行二进制吗?是的,您可以使用exec*
函数族
如果需要模拟system
的行为,可以fork
然后调用exec
函数
系统的POSIX表示:
system()函数的行为应与子进程是使用fork()创建的一样,子进程使用execl()调用sh实用程序,如下所示:
execl(,“sh”,“-c”,命令,(char*)0)
是的,您可以使用exec*
函数系列
如果需要模拟system
的行为,可以fork
然后调用exec
函数
系统的POSIX表示:
system()函数的行为应与子进程是使用fork()创建的一样,子进程使用execl()调用sh实用程序,如下所示:
execl(,“sh”,“-c”,命令,(char*)0)
是的,一般来说,不应使用系统
,至少出于以下原因:
- 它面临着shell引用问题的所有危险,因此除了硬编码的命令行之外,任何东西都有潜在的危险
- 它不是线程安全的
- 它会干扰呼叫程序中的信号处理
- 除非命令显式地将输出保存到文件中,否则它不提供从已执行程序获取输出的方法,除非退出状态
要执行外部程序,应使用posix_spawn
,或fork
,后跟一个exec
-系列函数。但是,如果可能的话,您应该避免依赖外部程序/命令,特别是当直接在程序中执行工作更容易、更不容易出错时。例如,我见过一些荒谬的用法,比如system(“sleep 1”)编码>而不是睡眠(1)代码>是的,一般来说,不应使用系统
,至少出于以下原因:
- 它面临着shell引用问题的所有危险,因此除了硬编码的命令行之外,任何东西都有潜在的危险
- 它不是线程安全的
- 它会干扰呼叫程序中的信号处理
- 除非命令显式地将输出保存到文件中,否则它不提供从已执行程序获取输出的方法,除非退出状态
要执行外部程序,应使用posix_spawn
,或fork
,后跟一个exec
-系列函数。但是,如果可能的话,您应该避免依赖外部程序/命令,特别是当直接在程序中执行工作更容易、更不容易出错时。例如,我见过一些荒谬的用法,比如system(“sleep 1”)编码>而不是睡眠(1)代码>认识到您可以同时运行多个程序,并通过管道(或其他管道)进行通信,这一点很重要。这主要是通过混合使用系统调用实现的
我强烈建议阅读或其他一些好书,对涉及的各种问题进行更多的解释(我们在几分钟内做不到),尤其是、,以及其他一些问题(可能是多路复用,例如避免循环管道中的死锁)。系统(3)
函数构建在这些系统调用之上(和/bin/sh
)
这本高级Linux编程书有一整章专门讨论进程
我还建议您了解Unix命令shell的工作原理。或者通过研究一些简单的免费shell(比如sash
)的源代码,或者至少通过strace
-使用它
实际上,它更有用。您可以获得伴随命令的输出
一些库(Poco、Qt、Glib/GTK)也具有强大的流程管理功能
使用fork
创建了一个新流程,这很难理解。使用execve
在相同的过程中启动新程序
所有进程都是由fork
(或者可能是vfork
)创建的,只有少数进程是由内核神奇地启动的(/sbin/init
,/sbin/modprobe
,…)必须认识到,可以同时运行多个程序,并通过管道(或其他管道)进行通信。这主要是通过混合使用系统调用实现的
我强烈建议阅读或其他一些好书,对涉及的各种问题进行更多的解释(我们在几分钟内做不到),尤其是、,以及其他一些问题(可能是多路复用,例如避免循环管道中的死锁)。系统(3)
函数构建在这些系统调用之上(和/bin/sh
)
这本高级Linux编程书有一整章专门讨论进程
我还建议您了解Unix命令shell的工作原理。或者通过研究一些简单的免费shell(比如sash
)的源代码,或者至少通过strace
-使用它
实际上,它更有用。您可以获得伴随命令的输出
一些库(Poco、Qt、Glib/GTK)也具有强大的流程管理功能
使用fork
创建了一个新流程,这很难理解。使用execve
在相同的过程中启动新程序
所有进程都是由fork
(或者可能是vfork
)创建的,只有少数进程是由内核神奇地启动的(/sbin/init
,/sbin/modprobe
,…)您是否查看了系统
手册页的底部,以查看“同时查看”中是否有任何内容部分?您希望通过使用其他内容来解决哪些不足