linux 程序的建立 和退出回收
======================執行緒======================================
程序概念:建立的程序,程序的退出,程序的回收
程序:一個正在執行的程式就叫程序,程序是一個動態的概念 ,程序在記憶體中
可執行程式(ELF):靜態的概念 (相當於儲存在硬碟中)
程序:在linux中用一個結構體
struct task_struct
{
}
引申:
struct abc
{
基本資料--》屬性 成員變數
函式指標--》指向某種型別的函式成員的方法
};
來表徵某個程序在執行的過程中所有的狀態資訊(程序id,父程序id)
孤兒程序:如果父程序沒有主動的去回收子程序,那麼子程序會變成孤兒程序,孤兒程序最終會被系統中一個叫做INIT的程序回收,init程序號是1,它是所有程序的祖先(組程序)
引用了程序的概念之後:意味著實現多工的同時併發操作(同時處理多個任務)
相關的API函式
ps -ef檢視系統中當前正在執行的程序資訊
程序的建立(建立子程序)
fork();建立子程序的時候,子程序會複製父程序的所有資源
vfork();建立子程序的時候,子程序是共享他父程序的資源,一定是子程序先執行
API函式原形
#include <unistd.h> //包含的標頭檔案
pid_t fork(void);
返回值:等於0 表示在子程序中
大於0 表示在父程序中
小於0 表示創建子程序失敗
失敗返回-1;
列子:
#include <stdio.h>#include <unistd.h>
int main()
{
pid_t myid;
myid=fork();
if(myid==0)
{
printf("子程序\n");
}
else if(myid>0)
{
printf("父程序\n");
}
else if(myid<0)
{
printf("建立程序失敗\n");
}
return 0;
}
打印出來的結果:
加延時的效果
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t myid;
myid=fork();
if(myid==0)
{
printf("子程序\n");
}
else if(myid>0)
{
sleep(1);
printf("父程序\n");
}
else if(myid<0)
{
printf("建立程序失敗\n");
}
return 0;
}
顯示出來的結果
(2)獲取程序和父程序的ID號
#include <unistd.h>
pid_t getpid(void); 獲取當前程序的ID
pid_t getppid(void); 獲取當前程序的父ID
打印出id號
=============================================================================
程序的退出
exit和_exit函式都是用來終止程序的。
exit() 退出的時候會重新整理IO緩衝區
_exit() 退出的時候不重新整理IO緩衝區
.exit是一個函式,有引數。exit執行完後把控制權交給系統
跟return之間的區別
return 返回到呼叫它的函式
exit 退出整個程序
例子:
return是語言級別的,不管你用不用都是存在的,它表示了呼叫堆疊的返回;而exit是作業系統中系統呼叫級別的,它表示了一個程序的結束。當然如果是mian函式中return(0)跟exit(0)是等效的
=============================================================================
程序的回收
回收子程序
wait()
waitpid()
pid_t wait(int *stat_loc); 阻塞父程序直到子程序退出然後回收子程序
返回值:成功返回子程序的id
失敗-1
引數:stat_loc 儲存子程序退出時的狀態資訊
//定義一個變數
int status;
wait(&status); //回收子程序
if(WIFEXITED(status))//判斷是否退出了
wait工作原理,
子程序結束後,系統向其父程序傳送SIGCHILD訊號,
父程序呼叫wait函式後阻塞,
父程序被sigchild訊號喚醒然後去回收殭屍子程序,
若父程序沒有子程序則wait函式返回錯誤,
幾個巨集用來獲取子程序的退出狀態。
WIFEXITED巨集用來判斷子程序是否正常終止(return、exit、_exit退出)
WIFSIGNALED巨集用來判斷子程序是否非正常終止(被訊號所終止)
WEXITSTATUS巨集用來得到正常終止情況下的程序返回值的。
pid_t waitpid(pid_t pid, int *stat_loc, int options);
它比wait要高階一點,因為它可以指定回收某個程序組裡面的程序,也可以指定回收某個程序
返回值:成功返回子程序的id
失敗-1
形參:pid 小於-1 比如-15 表示回收程序組id是15的那個程序組中的任意一個程序
-1 等待任意一個子程序
0 等待同進程組中任意一個子程序
>0 比如1245 指定回收id是1245的那個子程序