[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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM