在Linux中启动一个进程有多种方法,比如可以使用system()函数,但是在使用之前应先考虑一下;因为system()效率低,每次调用 system() 都会启动一个新的shell进程,这样会增加开销。而且具有安全风险,如果传递的命令包含用户输入,可能会导致安全漏洞;环境变量和路径问题也可能会影响命令的执行。目前多数使用fork()函数去创建一个新的进程,这个方法相对复杂了很多,但是效率高;可以在同一进程中更改程序,减少了创建新shell的开销。安全性也相对更好,可以更好地控制传递给新进程的参数,避免命令注入。灵活性也比system()高,可以轻松处理进程的输入和输出。
system
system()函数是C标准库中提供的,它主要提供了一种调用其它程序的简单方法。目前system() 函数仍然被使用,但其应用已相对减少,尤其是在涉及安全性和性能的场景中。此处简单介绍一下。
1.头文件
#include <stdlib.h>
2.函数原型
int system(const char *command);
3.参数
command:要执行的命令字符串。
4.返回值
成功执行system()函数:如果 system()成功调用了命令,返回值会包含该命令的执行状态信息。使用WIFEXITED(status)来判断命令是否正常退出。使用 WEXITSTATUS(status) 来获取命令的退出状态(也称为“返回码”),此值为命令的退出码,通常为 0 表示成功,非零值表示错误。
命令执行失败:如果system()无法创建子进程来执行命令(例如 fork 或 exec 调用失败),则它返回 -1,并且可以通过 errno 来获取具体的错误信息。
命令指针为空:如果传入的命令指针 NULL,system() 会检查系统上是否有可用的命令解释器(如 /bin/sh),若有则返回非零值,否则返回零值。
5.示例:使用system()函数创建进程调用shell命令
| #include <stdio.h>
#include <stdlib.h> int main() { // 使用 system() 函数执行 ls 命令 int status = system("ls -l"); // 检查命令执行是否成功 if (status == -1) { perror("system call failed"); return EXIT_FAILURE; } else { // 获取命令的退出状态 if (WIFEXITED(status)) { int exit_status = WEXITSTATUS(status); printf("Command exited with status: %d\n", exit_status); } } return EXIT_SUCCESS; } |
6.运行结果
ls -l命令执行成功会列出当前目录下的文件和文件夹,显示详细的文件信息。
7.代码解析
system("ls -l") 将调用 shell 执行 ls -l 命令,列出当前目录中的文件及其详细信息。如果 system() 返回 -1,表示调用失败,使用 perror() 打印错误信息。如果成功执行命令,可以使用 WIFEXITED(status) 来检查命令是否正常退出,并使用 WEXITSTATUS(status) 获取命令的退出状态。
200