文章目錄
- 1,程序建立fork(),擷取目前程序的程序号getpid()
-
- 程序建立fork()示例,getpid()
- 2,父子程序
-
- 子程序從何處開始運作?
- 父子程序誰先執行?
- 父程序能否多次調用fork()?子程序呢?
- 3,程序結束 exit()/_exit()
-
- 程序結束exit()示例
- 程序結束_exit()示例
1,程序建立fork(),擷取目前程序的程序号getpid()
#include <unistd.h>
pid_t fork(void);
- 建立新的程序,失敗時傳回-1
- 成功時父程序傳回子程序的程序号,子程序傳回0
- 通過fork的傳回值區分父程序和子程序
程序建立fork()示例,getpid()
pid_t pid;
if ((pid = fork()) < 0)
{
perror(“fork”);
return -1;
}
else if (pid == 0)
{
printf(“child process : my pid is %d\n”, getpid());
}
else
{
printf(“parent process : my pid is %d\n”, getpid());
}
2,父子程序
- 子程序繼承了父程序的内容:代碼、資料、系統資料
- 父子程序有獨立的位址空間,互不影響
-
若父程序先結束
·子程序成為孤兒程序,被init程序收養(init程序是Linux核心啟動後建立的以一個使用者級程序,程序号為1)
·子程序變成背景程序
-
若子程序先結束
·父程序如果沒有及時回收,子程序變成僵屍程序
- 系統規定,每個程序結束時,必須由其父程序回收
子程序從何處開始運作?
- 父程序從main函數開始運作
- 子程序從fork()的下一條語句(下一條指令)開始執行。(父程序執行到fork()時,PC中存放的是fork()的下一條指令的位址,而子程序繼承了父程序,也是從fork()的下一條指令開始執行,子程序并沒有執行fork())
父子程序誰先執行?
- 不确定,核心先排程子程序,子程序就先執行;核心先排程父程序,父程序就先執行
- 一般來說,父程序建立完fork()後,如果時間片沒有用完,通常會先執行父程序,父程序的時間片用完後,子程序就會被排程,再執行
父程序能否多次調用fork()?子程序呢?
- 理論上父程序沒有限制,父程序可以多次調用fork(),建立多個子程序,但是需要考慮這些子程序的回收
- 子程序同樣可以調用fork(),子程序建立的子程序叫孫程序。看程式應用的需求
3,程序結束 exit()/_exit()
#include <stdlib.h>
#include <unistd.h>
void exit(int status);//<stdlib.h>
void _exit(int status);//<unistd.h>
- 結束目前的程序并将status(低八位的值)傳回
- exit結束程序時會重新整理(流)緩沖區,_exit結束程序時不會重新整理(流)緩沖區
程序結束exit()示例
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf(“this process will exit\n”);//标準輸出是行緩沖,字元串末尾有換行符,此時字元串寫到了标準輸出的緩沖區裡,遇到了換行符,會重新整理流緩沖區,并輸出
printf(“this is the end”);//标準輸出是行緩沖,字元串末尾沒有換行符,此時隻是将字元串寫到了标準輸出的緩沖區裡,并沒有輸出
exit(0);//程式結束時會重新整理流緩沖區,将緩沖區中的内容輸出到終端
printf(“never be displayed”);
}
this process will [email protected]:~/test/process$ vi a.c
[email protected]:~/test/process$ gcc a.c
[email protected]:~/test/process$ ./a.out
this process will exit
this is the [email protected]:~/test/process$
程序結束_exit()示例
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
printf(“this process will exit\n”);//标準輸出是行緩沖,字元串末尾有換行符,此時字元串寫到了标準輸出的緩沖區裡,遇到了換行符,會重新整理流緩沖區,并輸出
printf(“this is the end”);//标準輸出是行緩沖,字元串末尾沒有換行符,此時隻是将字元串寫到了标準輸出的緩沖區裡,并沒有輸出
exit(0);//程式結束時不會重新整理流緩沖區
printf("never be displayed");
return 0;
}
this is the [email protected]:~/test/process$ vi a.c
[email protected]:~/test/process$ gcc a.c
[email protected]:~/test/process$ ./a.out
this process will exit