Bootstrap

linux

参考: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

;