linux c程式設計 程序控制 二 競爭條件

2022-05-30 21:18:10 字數 1102 閱讀 1243

前面介紹了父子程序,如果當多個程序企圖對共享資料進行處理。而最後的結果又取決於程序執行的順序時,就認為發生了競爭關係。通過下面的例子來看下

在這裡標準輸出被設定為不帶緩衝的,於是父子程序每輸出乙個字元就要進行一次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 ...