C语言[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