進程創建:
不同的操作系統創建進程的方式不盡相同,對於傳統 UNIX系統中是這樣處理的:父進程使用fork()創建子進程。Linux保留傳統的fork()創建子進程;創建後,父子進程存在以下關係:調用一次,返回兩次,分別返回父子進程;父子進程是獨立的進程,可以併發執行;父子進程具有獨立的地址空間,如果父子進程改變某個變量的值,子進程將不會看到這個變化,反之 亦然,因爲 父子進程在相互獨立的地址空間中併發執行。
另一個系統調用是vfork(),它允許子進程借用父進程的地址空間,父進程將被阻塞至子進程執行execve()或exit(),向父進程歸還地址空間並喚醒它。
[程序:fork()函數相關]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t result;
result = fork();
int newret;
int i=1; //用於測試父子進程之間的獨立性
if(result == -1)
{
perror("創建子進程失敗!");
exit;
}
else if(result == 0)
{
printf("返回傎是:%d/n,i的值是:%d/n說明是子進程:/n此進程的進程號是:%d/n此進程的父進程是:%d/n",result,i+1,getpid(),getppid());
newret = system("ls -l");
}
else
{
sleep(10); //休眠10秒
printf("返回傎是:%d/n,i的值是:%d/n說明是父進程:/n此進程的進程號是:%d/n此進程的父進程是:%d/n",result,i,getpid(),getppid());
newret = system("ls -al");
}
}
程序中,先用fork()創建一個進程。再分別顯示子/父進程的進程號和其父進程號,當result返回0時說明是新創建的進程號,而當result返回一個進程號時(不是-1和0),說明是父進程。而在子進程中的i自加1時,對於父進程並沒有影響。