天天看點

嵌入式Linux并發程式設計,程序,程序建立fork(),程序号查詢getpid(),程序結束exit()/_exit()1,程序建立fork(),擷取目前程序的程序号getpid()2,父子程序3,程序結束 exit()/_exit()

文章目錄

  • 1,程序建立fork(),擷取目前程序的程序号getpid()
    • 程序建立fork()示例,getpid()
  • 2,父子程序
    • 子程序從何處開始運作?
    • 父子程序誰先執行?
    • 父程序能否多次調用fork()?子程序呢?
  • 3,程序結束 exit()/_exit()
    • 程序結束exit()示例
    • 程序結束_exit()示例

1,程序建立fork(),擷取目前程序的程序号getpid()

#include <unistd.h>

pid_t fork(void);

  1. 建立新的程序,失敗時傳回-1
  2. 成功時父程序傳回子程序的程序号,子程序傳回0
  3. 通過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,父子程序

  1. 子程序繼承了父程序的内容:代碼、資料、系統資料
  2. 父子程序有獨立的位址空間,互不影響
  3. 若父程序先結束

    ·子程序成為孤兒程序,被init程序收養(init程序是Linux核心啟動後建立的以一個使用者級程序,程序号為1)

    ·子程序變成背景程序

  4. 若子程序先結束

    ·父程序如果沒有及時回收,子程序變成僵屍程序

  5. 系統規定,每個程序結束時,必須由其父程序回收

子程序從何處開始運作?

  1. 父程序從main函數開始運作
  2. 子程序從fork()的下一條語句(下一條指令)開始執行。(父程序執行到fork()時,PC中存放的是fork()的下一條指令的位址,而子程序繼承了父程序,也是從fork()的下一條指令開始執行,子程序并沒有執行fork())

父子程序誰先執行?

  1. 不确定,核心先排程子程序,子程序就先執行;核心先排程父程序,父程序就先執行
  2. 一般來說,父程序建立完fork()後,如果時間片沒有用完,通常會先執行父程序,父程序的時間片用完後,子程序就會被排程,再執行

父程序能否多次調用fork()?子程序呢?

  1. 理論上父程序沒有限制,父程序可以多次調用fork(),建立多個子程序,但是需要考慮這些子程序的回收
  2. 子程序同樣可以調用fork(),子程序建立的子程序叫孫程序。看程式應用的需求

3,程序結束 exit()/_exit()

#include <stdlib.h>

#include <unistd.h>

void exit(int status);//<stdlib.h>

void _exit(int status);//<unistd.h>

  1. 結束目前的程序并将status(低八位的值)傳回
  2. 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
           

繼續閱讀