Linux中的system()函数工作原理

来源:互联网 发布:教打字的软件 编辑:程序博客网 时间:2024/06/10 20:38

一、Linux中的system()函数源代码

#include <sys/types.h>#include <sys/wait.h>#include <errno.h>#include <unistd.h>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接受的命令为NULL时直接返回,否则fork出一个子进程,因为fork在两个进程:父进程和子进程中都返回,这里要检查返回的pid,fork在子进程中返回0,在父进程中返回子进程的pid,父进程使用waitpid等待子进程结束,子进程则是调用execl来启动一个程序代替自己,execl("/bin/sh", "sh", "-c", cmdstring, (char*)0)是调用shell,这个shell的路径是/bin/sh,后面的字符串都是参数,然后子进程就变成了一个shell进程,这个shell的参数是cmdstring,就是system接受的参数。在windows中的shell是command,想必大家很熟悉shell接受命令之后做的事了
二、fork函数的使用

      在Unix/Linux中用fork函数创建一个新的进程。进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程。该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程。两次返回的区别是子进程的返回值为0,父进程的返回值是新子进程的ID。子进程与父进程继续并发运行。如果父进程继续创建更多的子进程,子进程之间是兄弟关系,同样子进程也可以创建自己的子进程,这样可以建立起定义关系的进程之间的一种层次关系。

      程序包含位于内存的多个组成部分,执行程序的过程将根据需要来访问这些内容,包括文本段(text segment)、数据段(data segments)、栈(stack)和堆(heap)。文本段中存放CPU所执行的命令,数据段存放进程操作的所有数据变量,栈存放自动变量和函数数据,堆存放动态内存分配情况数据。当进程被创建时,子进程收到父进程的数据副本,包括数据空间、堆、栈和进程描述符