系统子例程
用途
运行 shell 命令。
库
标准 C 库 (libc.a)
语法
#include <stdlib.h> const char *String;
描述
system 子例程将 String 参数作为输入传递到 sh 命令。 然后, sh 命令将 String 参数解释为命令并运行它。
system 子例程调用 fork 子例程来创建一个子进程,该子进程反过来使用 exec l 子例程来运行/usr/bin/sh 命令,用于解释包含在 String 参数中的 shell 命令。 在可信路径上调用时, system 子例程运行可信路径 shell (/usr/bin/tsh)。 当前进程等待直到 shell 完成,然后返回 shell 的退出状态。 使用 sys/wait.h 文件中的结构,以与调用 wait 或 waitpid 子例程相同的方式返回 shell 的退出状态。
system 子例程忽略 SIGINT 和 SIGQUIT 信号, 并在等待 String 参数指定的命令终止时阻塞 SIGCHILD 信号。 如果这可能导致应用程序错过将杀死它的信号,那么如果命令由于接收到信号而终止,那么应用程序应使用 system 子例程返回的值来执行相应的操作。 system 子例程不影响调用进程的任何子进程的终止状态,除非该进程是由 system 子例程创建的。 在子进程终止之前, system 子例程不会返回。
参数
| 项 | 描述 |
|---|---|
| String | 指定有效的 sh shell 命令。 |
返回值
成功完成后, system 子例程将返回 shell 的退出状态。 使用 sys/wait.h 文件中的结构,以与调用 wait 或 waitpid 子例程相同的方式返回 shell 的退出状态。
如果 String 参数是空指针并且命令处理器可用,那么 system 子例程将返回非零值。 如果fork子程序失败或无法获得 shell 的退出状态,系统子程序将返回-1。 如果 exec l 子例程失败,那么系统子例程返回值 127。 在所有情况下, errno 全局变量都设置为指示错误。
错误代码
如果下列任何一项为真,那么 system 子例程将失败:
| 项 | 描述 |
|---|---|
| 再次 | 超出了系统对正在运行的进程总数 (系统范围或单个用户标识) 施加的限制。 |
| EINTR | system 子例程被在启动请求的进程之前捕获的信号中断。 在请求的进程开始后,将永远不会返回 EINTR 错误代码。 |
| ENOMEM | 存储空间不足。 |