Linux程式設計 程序 訊號

2021-04-18 01:18:45 字數 3323 閱讀 4805

半年不接觸linux,有些東西變的太陌生了,再回顧一下我的linux「基礎」程式設計吧

程序

1.得到程序資訊的常用函式:

#include

#include 

pid_t getpid(void); //程序id

pid_t getppid(void);//父程序id

uid_t getuid(void); //程序所有者的id

uid_t geteuid(void); //程序有效使用者id,和系統的資源使用有關,涉及到程序的許可權

gid_t getgid(void); //組id

git_t getegid(void);//有效組id,不知道這兩個是幹什麼的,要用到的時候再說

另乙個很有用的函式和結構:

struct passwd ;

#include 

#include 

struct passwd *getpwuid(uid_t uid);//得到「passwd」  

2.建立程序

#include 

pid_t fork();

在建立子程序後,為了區分父程序和子程序,我們必須跟蹤fork的返回值.失敗返回-1,父程序中返回子程序id,也就是》0,子程序中返回0.

呼叫wait或者waitpid系統呼叫來處理程序間的資源利用衝突。

#include ;

#include ;

pid_t wait(int *stat_loc);

//使父程序阻塞直到乙個子程序結束或者是父程序接受到了乙個訊號.如果沒有父程序沒有子程序或者他的子程序已經結束了wait回立即返回.成功時(因乙個子程序結束)wait將返回子程序的id,否則返回-1. stat_loc是子程序的退出狀態. 子程序呼叫exit,_exit 或者是return來設定這個值. 為了得到這個值linux定義了幾個巨集來測試這個返回值. wifexited:判斷子程序退出值是非0 ;wexitstatus:判斷子程序的退出值(當子程序退出時非0) ;wifsignaled:子程序由於有沒有獲得的訊號而退出;wtermsig:子程序沒有獲得的訊號號(在wifsignaled為真時才有意義).

pid_t waitpid(pid_t pid,int *stat_loc,int options);

// waitpid等待指定的子程序直到子程序返回.如果pid為正值則等待指定的程序(pid).如果為0則等待任何乙個組id和呼叫者的組id相同的程序.為-1時等同於wait呼叫.小於-1時等待任何乙個組id等於pid絕對值的程序程. stat_loc同上. options可以決定父程序的狀態.可以取兩個值 wnohang:父程序立即返回當沒有子程序存在時. wuntached:當子程序結束時waitpid返回,但是子程序的退出狀態不可得到.

3.呼叫系統程式:exec()

父程序建立子程序後,子程序一般要執行不同的程式.為了呼叫系統程式,我們可以使用系統呼叫exec族呼叫. #include ;

int execl(const char *path,const char *arg,...);

int execlp(const char *file,const char *arg,...);

int execle(const char *path,const char *arg,...);

int execv(const char *path,char *const argv);

int execvp(const char *file,char *const argv);

//這五個函式總是見到,總是使用。它們有著不同的功能。

4.程序的終止

訊號

1.  產生、傳送

有兩種可能:硬體、軟體。

#include ;

#include ;

#include ;

int kill(pid_t pid,int sig);    //向任意程序傳送訊號

int raise(int sig);          //向自己傳送訊號

unisigned int alarm(unsigned int seconds);//定時傳送訊號

setitimer                    //

2.  訊號操作

接到訊號後要進行相應操作,如若不然將執行系統預設操作。

a、 訊號遮蔽

#include ;

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set,int signo);

int sigdelset(sigset_t *set,int signo);

int sigi**ember(sigset_t *set,int signo);

int sigprocmask(int how,const sigset_t *set,sigset_t *oset);

//還是重點記一下sigprocmask函式吧:引數how決定函式的操作方式,有如下幾種:

sig_block:增加乙個訊號集合到當前程序的阻塞集合之中.          

sig_unblock:從當前的阻塞集合之中刪除乙個訊號集合.      

sig_setmask:將當前的訊號集合設定為訊號阻塞集合.

注意:訊號遮蔽只是將訊號加入到訊號阻塞集合之中,並沒有丟棄這個訊號.一旦訊號遮蔽取消了,這個訊號就會發生作用.    

b.如果我們不想只是簡單的遮蔽訊號,而是想在訊號產生時採取一定的動作,那麼就要使用sigaction函式 #include ;

int sigaction(int signo,const struct sigaction *act,struct sigaction *oact);

struct sigaction  //這個函式的主要操作在於設定act,sa_handler對應著操作函式。

c.pause和sigsuspend

#include ;

#include ;

int pause(void); //掛起程序直到乙個訊號發生

int sigsuspend(const sigset_t *sigmask);

//掛起程序,並且在呼叫的時候用sigmask取代當前的訊號阻塞集合

#include ;

int sigsetjmp(sigjmp_buf env,int val);

void siglongjmp(sigjmp_buf env,int val); //類似於goto語句

3.  例項

Linux程式設計 程序和訊號

程序的結構 型別和排程 可以把程序看做是正在執行的程式。程序結構 程序識別符號 檔案描述符 棧空間和環境變數 程式計數器 作業系統通過程序的 pid對它們進行管理,pid是程序表的索引。linux 排程器根據 程序的優先順序 來決定呼叫哪個程序。用不同的方法啟動新程序 system 函式作用 執行以...

Linux 程序訊號

概念 訊號是程序之間事件非同步通知的一種方式,屬於軟中斷。訊號處理常見方式 忽略此訊號。執行該訊號的預設處理動作。提供乙個訊號處理函式,要求核心在處理該訊號時切換到使用者態執行這個處理函式,這種方式稱為捕捉 catch 乙個訊號。產生訊號 捕捉訊號 核心如何實現訊號的捕捉 如果訊號的處理動作是使用者...

Linux程序訊號

訊號是乙個軟體中斷。作業系統通過訊號告訴程序發生了某個事件,打斷程序當前的操作,去處理這個事件。1.訊號的檢視kill l 檢視系統中的訊號種類在linux作業系統中,一共有62中訊號。34 64號訊號 後期擴充的,因為沒有具體對應事件,因此命名比較草率 可靠訊號。訊號的生命週期 產生 在程序中註冊...