Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 除了system()之外,还有其他方法执行二进制文件吗_C_Linux - Fatal编程技术网

C 除了system()之外,还有其他方法执行二进制文件吗

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*

我在Linux上开发了一个C代码,我想执行一个二进制程序,比如说
/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
,…)

您是否查看了
系统
手册页的底部,以查看“同时查看”中是否有任何内容部分?您希望通过使用其他内容来解决哪些不足