半年不接觸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號訊號 後期擴充的,因為沒有具體對應事件,因此命名比較草率 可靠訊號。訊號的生命週期 產生 在程序中註冊...