#include <stdlib.h>
int system(const char *command)

system函数的头文件是stdlib.h

system函数执行了三步操作:

  1. fork一个子进程                                                                                                                                                                                                              解释一下这句话的涵义,专业人士就是厉害,随口一句就得去百度:   fork()函数用于从一个已经存在的进程中创建一个新的进程,这个新进程被称为子进程,相应地称创建子进程地进程为父进程。   使用fork()函数得到的子进程是父进程的复制品,子进程完全复制了父进程的资源,包括进程上下文、代码区、数据区、堆区、栈区、内存信息、打开文件的文件描述符、信号处理函数、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等信息,而子进程与父进程的区别有进程号、资源使用情况和计时器等。
  2. 在子进程中调用exec函数去执行command

       3.在父进程中调用wait去等待子进程结束        

 

                            对于fork失败,system()函数返回-1。

 

                           如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。

 

                        (注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了)

 

                           如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127.

 

                           如果command为NULL,则system()函数返回非0值,一般为1.

        即system成功的返回值为0

system()函数的源码

int system(const char * cmdstring)
{
    pid_t pid;
    int status;

if(cmdstring == NULL)
{
    return (1); //如果cmdstring为空,返回非零值,一般为1
}

if((pid = fork())<0)
{
    status = -1; //fork失败,返回-1
}
else if(pid == 0)
{
    execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
    _exit(127); // exec执行失败返回127,注意exec只在失败时才返回现在的进程,成功的话现在的进程就不存在啦~~
}
else //父进程
{
    while(waitpid(pid, &status, 0) < 0)
    {
        if(errno != EINTR)
        {
            status = -1; //如果waitpid被信号中断,则返回-1
            break;
        }
    }
}

    return status; //如果waitpid成功,则返回子进程的返回状态
}

仔细看完这个system()函数的简单实现,那么该函数的返回值就清晰了吧,那么什么时候system()函数返回0呢?只在command命令返回0时