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