1. 程式人生 > >linux 程序的建立 和退出回收

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的那個子程序