[Linux]C语言Linux系统编程创建进程

1.进程ID

诸一个历程都出于一个唯一的标识符表示,即经过ID,简称pid.系统保证在某时刻每个pid都是绝无仅有的。

1.1分配过程ID

缺省事态下,内核将经过ID的极其酷价值限制为32768,可以于此间安装/proc/sys/kernel/pid_max,在缺少日外,内核不见面用已经分配的ID.

2.收获进程id和父进程id

  #include <stdio.h>
  #include <sys/types.h>
  #include <unistd.h>
  int main(){
          int pid=getpid();
          int ppid=getppid();
          printf("pid:%d ppid:%d \n",pid,ppid);
  }

 

3.周转新历程

率先创建新的进程fork()

以初的长河面临实践程序exec系列的系统调用

4.exec多样的网调用

execl()函数的原型为 int execl(const char *path,const char
*arg,…)

path是次路径,arg是传递给指定程序的可变长度参数列表,最后要是null结尾

const 也堪与指针变量一起使用,这样好界定指针变量本身,也得限制指针指向的多寡。

习以为常状态下execl()不见面回去结果,成功的调用会以超到新的主次的入口点作为完结,错误的早晚会回到-1

         int ret;
         ret=execl("/usr/bin/vim","vim","text.txt",NULL);
         if(ret==1){
                 printf("execl error");
         }

 

5.fork()系统调用

始建一个同眼前过程映像一样的经过可以透过fork()系统调用,调用者从fork()返回后,仍然延续运行。

此时此刻经过就是大人进程,创建成功之历程是分支进程。

于父亲进程成功的fork()调用,会返回子进程的pid

于子进程fork()调用会返回0

#include <stdio.h>
#include <unistd.h>
int main(){
        int pid,ppid;

        int ret=fork();
        if(ret>0){
                pid=getpid();
                ppid=getppid();
                printf("我是父进程,pid=%d , ppid=%d ,我新建的子进程pid=%d\n",pi
d,ppid,ret);
                sleep(3);//父进程不能太快终止,否则看不出子进程ppid的效果
        }else if(ret==0){
                pid=getpid();
                ppid=getppid();
                printf("我是子进程,pid=%d , ppid=%d \n",pid,ppid);
        }else if(ret==-1){
                perror("fork");
        }   
}

自己是大进程,pid=13890 ,
ppid=10038 ,我新建的子进程pid=13891

我是分段进程,pid=13891 ,
ppid=13890