1.關(guān)于fork()函數(shù):
子進(jìn)程的()改變,父進(jìn)程沒有也相應(yīng)改變 a.文件指針 b.局部變量 c.全局變量 d.靜態(tài)變量
b
pid_t pid;
switch (pid = fork())
{
case -1:
/* 這里pid為-1,fork函數(shù)失敗 */
/* 一些可能的原因是 */
/* 進(jìn)程數(shù)或虛擬內(nèi)存用盡 */
perror(“The fork failed!”);
break;
case 0:
/* pid為0,子進(jìn)程 */
/* 這里,我們是孩子,要做什么? */
/* … */
/* 但是做完后, 我們需要做類似下面: */
_exit(0);
default:
/* pid大于0,為父進(jìn)程得到的子進(jìn)程號 */
printf(“Child’s pid is %d\n”,pid);
}
fork之后,操作系統(tǒng)會復(fù)制一個與父進(jìn)程完全相同的子進(jìn)程,雖說是父子關(guān)系,但是在操作系統(tǒng)看來,他們更像兄弟關(guān)系,這2個進(jìn)程共享代碼空間,但是數(shù)據(jù)空間是互相獨立的,子進(jìn)程數(shù)據(jù)空間中的內(nèi)容是父進(jìn)程的完整拷貝,指令指針也完全相同,但只有一點不同,如果fork成功,子進(jìn)程中fork的返回值是0,父進(jìn)程中fork的返回值是子進(jìn)程的進(jìn)程號,如果fork不成功,父進(jìn)程會返回錯誤。
可以這樣想象,2個進(jìn)程一直同時運行,而且步調(diào)一致,在fork之后,他們分別作不同的工作,也就是分岔了。這也是fork為什么叫fork的原因。
至于那一個最先運行,可能與操作系統(tǒng)有關(guān),而且這個問題在實際應(yīng)用中并不重要,如果需要父子進(jìn)程協(xié)同,可以通過原語的辦法解決。