函数作用
执行一个shell的命令
其实通过查看system函数的源码就会发现,system函数调用后会进行一次fork,然后就会在子进程中运行“execl("/bin/sh", "sh", "-c", command, (char *) 0);”
而“sh -c XXX” 这个命令,其实就是相当于执行了 XXX 这个可执行文件,至于为什么不直接运行要加上sh -c,我也不是很清楚,可以参考这个博文更加了解 sh-c:
linux--sh -c_linux sh -c_星空黑夜的博客-CSDN博客
也就是说函数的作用就是执行command命令,底层就是调用execl函数,所以system函数可以看作一个对于execl函数的再封装,使得使用形式更加简单。
需要添加的库
#include <stdlib.h>
函数原型
int system(const char *command);
函数参数
- command:根据上面的说明,这里的command其实就是需要执行的命令字符串
- 返回值:成功,则返回进程的状态值;当sh不能执行时,返回127;失败返回-1
实操演示
对于上节使用execl来修改配置文件的代码,将execl换成system函数:
demo5.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
pid_t fork_return;
int cmd = 0;
printf("please input a cmd number\n");
scanf("%d",&cmd);
if(cmd == 1){
fork_return = fork();
if(fork_return > 0){
wait(NULL);
}else{
printf("This is the son JC,PID = %d\n",getpid());
if(system("/home/mjm/FILE/modify /home/mjm/FILE/test.config") == -1){
printf("system failed!\n");
perror("why");
}
printf("system finish\n");
}
}
return 0;
}
运行代码:
此时再打开test.config:
可见,修改成功,所以使用system函数,方法更简单,同时实现了同样的效果
并且,和单独调用execl函数略有不同,system函数在运行完之后会回到原程序,这也是为什么在原函数system调用后printf的“system finish” 也会被打印