前面介紹了父子程序,如果當多個程序企圖對共享資料進行處理。而最後的結果又取決於程序執行的順序時,就認為發生了競爭關係。通過下面的例子來看下
在這裡標準輸出被設定為不帶緩衝的,於是父子程序每輸出乙個字元就要進行一次write
呼叫。這樣做的目的是盡可能多次地在兩個程序之間進行切換,以便演示競爭條件。
static void charatatime(char *str)
void competition()
else if(pid == 0)
else
exit(0);
}來看下系統執行的結果:
第一次:
第二次:
第三次:
通過三次執行結果來看,除了第一次執行正常外,其他兩次的字元都是雜亂的。原因就在於父子程序啟動的順序是有先有後的。
為了避免競爭條件,在多個程序之間需要有某種形式的訊號傳送和接收的方式。在linux
中可以使用訊號機制。具體實現方法如下
#include
#include
#include
#include
#include
#include
#include
static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;
/* signal handler for sigusr1 and sigusr2 */
static void sig_usr(int signo)
void tell_wait()
void tell_parent(pid_t pid)
void wait_parent()
void tell_child(pid_t pid)
void wait_child()
void do_task(char *task_str)
那麼在之前的**更新如下:
oid competition()
else if(pid == 0)
else
exit(0);
}此時執行的順序就會固定。也不會出現雜亂的字元。
Linux C 程序控制
1.程式 程序 程序id pit t型別。2.get pid 取得程序idgetppid 取得父程序id。a getuid geteuid getgid getegid 取得使用者id及組id。3.fork函式建立新的程序。pid tfork void a fork函式不需要引數。b 對於父程序fo...
Linux c 程序控制
getpid獲得程序識別碼 表頭檔案 include函式原型 pid t getpid void 返回值 目前程序的程序識別碼 getppid獲得父程序的程序識別碼 表頭檔案 include函式原型 pid t getppid void 返回值 目前程序的父程序識別碼 fork建立子程序 表頭檔案 ...
linux c程式設計 程序控制 四 程序關係
每乙個程序除了有乙個程序id外,還屬於乙個程序組。程序組是乙個或多個程序的集合,通常情況下,他們是在同一作業中結合起來的,同一程序組的個程序接受來自同一終端的各種訊號。每乙個程序組有乙個唯一的程序id。函式getpgrp 返 用程序的程序組id。include pid t getpgrp void ...