★進程標識符
算法
每一個進程都有非負的×××表示惟一的進程ID。下面是一些標識符:
pid:調用進程的ID(獲取方式getpid)
ppid:調用進程的父進程ID(獲取方式getppid)
uid:調用進程的實際用戶ID(獲取方式getuid)
euid:調用進程的有效用戶ID(獲取方式getuid)
gid:調用進程的實際組ID(獲取getgid)
egid:調用進程的有效組ID(獲取getegid)ide
例:用fork建立子進程,查看父子進程的pid、ppid、uid、euid。函數
運行結果:ui
★進程建立spa
上篇博客中提到可使用fork( )和execve( )來建立,咱們可以知道fork後的子進程可以得到父進程的數據空間、堆、棧的副本,父子進程同時共享文本段。因此說:子進程不能改變父進程中某個變量的值,內核只能修改內存副本中該變量的值。3d
例:blog
運行結果:進程
由上面的程序結果可以看到,子進程對變量的值進行更改,可是並無影響到父進程中變量的值。通常父進程和子進程執行的前後順序是不肯定的,取決於系統的調度算法。上面的程序父進程先sleep,使得子進程先執行。內存
這裏再介紹一下vfork( )函數,vfork和fork都可以建立一個子進程,可是vfork的子進程不會將父進程的地址空間進行復制,因此子進程會先執行,在其調用exec後或者exit後,父進程才能夠執行。get
例:
運行結果:
★進程等待
進程等待可使用兩個函數wait和waitpid。調用以後會產生如下的一些狀況:
(1)若是全部的子進程都處於運行狀態,則會阻塞。
(2)若是一個子進程已經終止,正在等待父進程獲取其狀態,則取得該子進程的終止狀態當即返回。
(3)若是它沒有任何的子進程,則當即出錯返回。
頭文件:#include <sys/types.h> #include <sys/wait.h>
① pid_t wait (int* status);
②pid_t waitpid(pid_t pid, int* status, int options);
wait函數若是成功,則返回被等待進程的pid,失敗返回-1,waitpid函數正常返回收集到的子進程的ID,失敗返回-1.