参考:https://www.cnblogs.com/mickole/p/3187974.html
1.函数説明:执行一个shell命令
system - execute a shell command
2.函数原型:
SYNOPSIS
#include <stdlib.h>
int system(const char *command)
3.函数说明:
- 无法执行shell返回-127
- 无法执行system()返回-1
- 执行system顺利返回shell命令的返回码
4.代码演示
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
void foo_system()
{
int status=system("ls");
if(status == -1)
{
EXIT_ERR("system error");
}else{
//WIFEXITED(status) 宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。
if(WIFEXITED(status))
{
//WEXITSTATUS(status)提取子进程的返回值
if(WEXITSTATUS(status) == 0)
printf("run command success \n");
else
printf("run command failed and exit code is %d\n",WEXITSTATUS(status));
}else{
printf("exit status = %d \n",WEXITSTATUS(status));
}
}
}
5.效果截图
6.函数实现
int system(const char * cmdstring)
{
pid_t pid;
int status;
if(cmdstring == NULL){
return (1);
}
if((pid = fork())<0){
status = -1;
}
else if(pid == 0){
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
_exit(127); //子进程正常执行则不会执行此语句
}
else{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER){
status = -1;
break;
}
}
}
return status;
}
可以看出system()的实现,其实就是利用fork()出子进程,子进程中调用execl()执行shell命令,父进程等待调用waitpid()等待子进程结束,然后返回子进程执行完的status