在Linux活着Unix下,每个进程都有一个唯一的,整数形式的进程标识符。

通过fork系统调用可以创建新进程。新的进程通过复制原来进程的地址空间而成。

这种机制允许父进程与子进程能够方便的进行通信。父进程与子进程都继续执行位于系统调用fork()之后的指令。不同的是,对于子进程,fork完成之后返回值为0,对于父进程fork完成之后返回值为子进程的pid,是一个非零整数。

通常,在系统调用fork之后,一个进程会使用系统调用函数exec(),来取代进程的内存空间。exec()将二进制文件装入内存,清除原来exec()的内存映射,并开始只执行。

以下,用C程序在linux下,实现以上的论述。主要功能为,父进程创建了一个子进程,子进程用于执行ls命令,列出特定目录下的内容。父进程通过调用wait()函数,等待子进程完成操作,最后使用exit()函数表示父进程结束。

 

######################一些系统调用函数的说明####################

范例:
/* 执行ls -al /etc/passwd execlp()会依PATH  变量中的/bin找到/bin/ls */
 
#include<unistd.h>
main()
{
execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
}
 
执行结果:
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
 
execlp()会从PATH  环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空 指针(NULL)作结束。如果用常数0来表示一个空 指针,则必须将它强制转换为一个字符指针,否则将它解释为×××参数,如果一个×××数的长度与char * 的长度不同,那么exec函数的 实际参数就将出错。如果 函数调用成功,进程自己的执行代码就会变成加载程序的代码,execlp()后边的代码也就不会执行了.
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
 
 
 
 
 
wait(等待子进程 中断或结束)
相关函数 waitpid,fork
表头文件
#include<sys/types.h>
#include<sys/wait.h>
定义函数 pid_t wait (int * status);
函数说明
wait()会暂时停止进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status 可以设成NULL。子进程的结束状态值请参考下面的waitpid()。
返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。
 
 
 
-----------creatprocess.c-------------

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>//execlp() relation
#include <sys/wait.h>//wait() relation
#include <stdlib.h>//exit() relation

int main( int argc, char *argv[] )
{
    pid_t pid;
    /*for a child process*/
    pid =  fork();
    /*create process failed*/
    if( pid < 0)
    {
        fprintf(stderr,"Fork Failed");
        exit (-1);
    }
    /*create a child process success*/
    else if( pid == 0 )
    {
        printf("*******come into child process!!!******\n\n");
        execlp( "ls", "ls", "/", (char *)0 );
    }
    /*parent process*/
    else
    {
        /*parent will wait for the child to complete*/
        wait(NULL);
        printf("\n*********Child Complete,child's pid is %d **********\n\n",pid);
        exit(0);
    }
    return 0;
}