今天学习了linux下的c编程的进程的创建,在这里总结一下:
    一个程序可以由多个进程共同执行。其实进程也是一个层次结构,最上面的是一个控制进程,也就是我们常说的init进程,所有的进程都是由它创建的。
fork()函数是最基本的进程创建的函数,它在unistd.h的头文件中声明的。pid_t fork(void);新创建的进程被称作子进程(child process),创建它的进程被称为父进程(parent process)。系统调用fork()没有参数,它返回的是一个pid_t类型的值pid。每一个进程都有一个唯一的进程标识符,如果pid=0,则它是子进程,如果pid>0,则它是父进程;如果返回的是-1,则说明进程创建失败。进程创建失败的原因可能是系统允许的进程数目已经达到最大。一下是进程创建的第一个实例:
/***********************************************/
#include<stdio.h>
#include<unistd.h>
void main()
{
 int pid;//定义一个进程标识符
 printf("now only one process.\n");
 pid=fork();
 if(!pid)
  {
  printf("i'm the child process.\n");
 }
 else if(pid>0)
  {
  printf("the parent's process pid is %d.\n",pid);
 }
  else
   printf("the creation failed.\n");
 
}
/********************************************************/
    与fork()同时使用的还有exec()系列的函数:
下面给出了exec 系列调用在Linux 系统库中unistd.h 中的函数声明:
int execl( const char *path, const char *arg, ...);
int execlp( const char *file, const char *arg, ...);
int execle( const char *path, const char *arg , ..., char* const envp[]);
int execv( const char *path, char *const argv[]);
int execvp( const char *file, char *const argv[];
    如果exec()函数调用成功的话,则该进程将替换原先的进程,进程标识符不会改变,就相当于接受原来的进程,继续执行之后的任务,原先的进程会消失。
这里主要讲一下int execl( const char *path, const char *arg, ...)的使用:
/***********************************************/
#include<stdio.h>
#include<unistd.h>
void main()
{
 printf("executing ls:\n");
 execl("/bin/ls","ls","-1",NULL);
 perror("execl failed.\n");
 exit(1);
}
/***********************************************/
    该函数的第一个参数主要是指要执行的可执行文件的路径名,同时需要包含这个可执行文件。之后的都是参数,但是需要注意,最后一个参数必须是NULL。
下面我们再来看一下fork()和exec()函数的连用,首先看一个实例:
/******************************************/
#include<stdio.h>
#include<unistd.h>
main()
{
 pid_t pid;//creat a process identifier
 pid=fork();//create a child process
 switch(pid)
 {
  case -1:
   printf("create failed.\n");
   exit(1);
  case 0:
   execl("/bin/ls","ls","-l",NULL);
   perror("execle failed.\n");
   exit(1);
  default:
   wait(NULL);//wait until the child process finished
   printf("ls complete.\n");
   exit(0);
  
 }
}
/******************************************/
    这个程序主要是完成了fork()和exec()的连用,先由父进程创建一个子进程,然后父进程马上进入睡眠状态,即调用wait(),使父进程进入阻塞,只有等到由子进程结束时才唤醒。