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)程號(hào) */
printf(“Child’s pid is %d\n”,pid);
}
fork之后,操作系統(tǒng)會(huì)復(fù)制一個(gè)與父進(jìn)程完全相同的子進(jìn)程,雖說是父子關(guān)系,但是在操作系統(tǒng)看來,他們更像兄弟關(guān)系,這2個(gè)進(jìn)程共享代碼空間,但是數(shù)據(jù)空間是互相獨(dú)立的,子進(jìn)程數(shù)據(jù)空間中的內(nèi)容是父進(jìn)程的完整拷貝,指令指針也完全相同,但只有一點(diǎn)不同,如果fork成功,子進(jìn)程中fork的返回值是0,父進(jìn)程中fork的返回值是子進(jìn)程的進(jìn)程號(hào),如果fork不成功,父進(jìn)程會(huì)返回錯(cuò)誤。
可以這樣想象,2個(gè)進(jìn)程一直同時(shí)運(yùn)行,而且步調(diào)一致,在fork之后,他們分別作不同的工作,也就是分岔了。這也是fork為什么叫fork的原因。
至于那一個(gè)最先運(yùn)行,可能與操作系統(tǒng)有關(guān),而且這個(gè)問題在實(shí)際應(yīng)用中并不重要,如果需要父子進(jìn)程協(xié)同,可以通過原語的辦法解決。