當前位置:首頁 » 操作系統 » linuxsemaphore

linuxsemaphore

發布時間: 2022-09-07 15:12:32

Ⅰ 急!linux下,GCC編譯,原程序包含<semaphore.h>頭文件,為什麼編譯時說sem_wait,sem_post等未定義的引用

編譯時加上參數:-lpthread

要看報錯的階段,是在編譯還是鏈接階段.
如果編譯時函數沒有找到,那是頭文件的問題,如果鏈接時未定義引用,那是c庫的問題.
如果你的頭文件都正常包含了,那可能你的c庫沒有使能semaphore的支持.

Ⅱ linux 信號量是什麼怎麼用

Linux信號量(semaphore)是一種互斥機制。即對某個互斥資源的訪問會收到信號量的保護,在訪問之前需要獲得信號量。
在操作完共享資源後,需釋放信號量,以便另外的進程來獲得資源。獲得和釋放應該成對出現。
獲得信號量集,需要注意的是,獲得的是一個集合,而不是一個單一的信號量。
#include
#include
#include
1: int semget(key_t key,int nsems,int semflg);
key:系統根據這個值來獲取信號量集。
nsems:此信號集包括幾個信號量。
semflg:創建此信號量的屬性。 (IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)
成功則返回該信號量集的ID。
註:
既指定IPC_CREAT又指定IPC_EXCL時,如果系統中該信號量集已經存在,則馬上返回。
如果需要獲得存在的信號量,則將此參數置0.
2: int semctl(int semid,int senum,int cmd....)
semid:信號量ID。
senum:對信號量集中的第幾個信號量進行控制。(從0開始)
cmd:需要進行的操作。(SETVAL是其中的一個)。
根據cmd的不同可能存在第四個參數,cmd=SETVAL時,表示同時信號量可以被獲得幾次,如第四個參數
num=1表示只能被獲得一次,既被信號量保護的資源只能同時被一個程序使用。
該系統調用,是在對信號量初始化時用的。
-3: 「3」前面加了"-"表示當需要使用互斥資源時應該做這步。
int semop(int semid,struct sembuf *sem,int num_elements);
struct sembuf {
unsigned short sem_num; //該信號量集中的第幾個信號量。
int sem_op;//需要獲得還是釋放信號量
int sem_flg;//相關動作
};
num_elements:需要對該信號量集中的多少個信號量進行處理。
獲得信號量時,將sembuf結構提初始化為:
sem_num = 0; //該信號量集中的首個信號量
sem_op = -1; //獲得信號量
sem_flag = IPC_NOWAIT; //如果不能獲得信號量,馬上返回。
semop(semid,_sem,1);
同理釋放信號量時,將sem_op設為1.
以上是對信號量的簡單處理

Ⅲ linux進程間信號量的初始信號

分配與初始化信號量是兩個相互獨立的操作。以 0 為第二參數,以 SETALL 為第三個參數調用 semctl 可以對一個信號量組進行初始化。第四個參數是一個 semun 對象,且它的 array 欄位指向一個 unsigned short數組。數組中的每個值均用於初始化該組中的一個信號量。
代碼 5.3 展示了初始化一個二元信號量的函數。
代碼 5.3 (sem_init.c) 初始化一個二元信號量
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* 我們必須自己定義 union semun。*/
union semun
{
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
/* 將一個二元信號量初始化為 1。*/
int binary_semaphore_initialize (int semid)
{
union semun argument;
unsigned short values[1];
values[0] = 1;
argument.array = values;
return semctl (semid, 0, SETALL, argument);
}

Ⅳ linux編程時的信號量問題。 我以前用過的信號量頭文件是<semaphore.h>,而現在又發現還有個<sys/sem.h>

semaphore.h 提供的是 POSIX 標準定義的 semaphore 介面 ( sem_open, sem_wait, ...) ,這組介面使用更簡單,設計的較好。

而 sys/sem.h 里 提供的是符合 System V 標準的 semaphore介面 (semget, semop, ...),這些介面都比較老了, linux提供主要是為了兼容老代碼。

對於 linux 開發來說,新寫的代碼,都應該考慮採用 POSIX 標準的信號量。

Ⅳ 關於linux下的多線程使用sem信號量的運行問題

不是信號量的問題
printf函數,是先寫到輸出緩沖,遇到\n時,或者緩沖區滿時,或者有強制輸出(fflush)時,才會將緩沖區里的內容輸出到屏幕上(標准輸出設備:stdout)。你的代碼裡面並沒有以上3個觸發條件的任意一種,所以printf的內存沒有實際輸出到屏幕上。
你只要在每個printf函數後面加上fflush(stdout);就可以了。

Ⅵ Linux 中編程的 semaphore結構體在哪個頭文件中

semaphore.h定義的是內核里用semaphore,用戶態程序用的sem_t也在名叫semaphore.h的文件里定義,不過應該在系統的include目錄下,而不是在內核源代碼了

Ⅶ 總結:linux進程間通信的幾種機制的比較及適

1 管道(Pipe)及有名管道(namedpipe):
管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;
2 信號(Signal):
信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外介面,用sigaction函數重新實現了signal函數);
3 報文(Message)隊列(消息隊列):
消息隊列是消息的鏈接表,包括Posix消息隊列systemV消息隊列。有足夠許可權的進程可以向隊列中添加消息,被賦予讀許可權的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
4 共享內存:
使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
5 信號量(semaphore):
主要作為進程間以及同一進程不同線程之間的同步手段。
6 套介面(Socket):
更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和SystemV的變種都支持套接字。

Ⅷ linux進程間信號量的等待投遞

每個信號量都具有一個非負的值,且信號量支持等待和投遞操作。系統調用 semop 實現了這兩個操作。它的第一個參數是信號量的標識符,第二個參數是一個包含 struct sembuf 類型元素的數組;這些元素指明了您希望執行的操作。第三個參數是這個數組的長度。結構體sembuf中包含如下欄位:
sem_num將要執行操作的信號量組中包含的信號量數量。 sem_op是一個指定了操作類型的整數。 如果sem_op是一個正整數,則這個值會立刻被加到信號量的值上。 [BR]如果 sem_op 為負,則將從信號量值中減去它的絕對值。如果這將使信號量的值小於零,則這個操作會導致進程阻塞,直到信號量的值至少等於操作值的絕對值(由其它進程增加它的值)。 [BR]如果 sem_op 為0,這個操作會導致進程阻塞,直到信號量的值為零才恢復。 sem_flg 是一個符號位。指定 IPC_NOWAIT 以防止操作阻塞;如果該操作本應阻塞,則semop調用會失敗。如果為sem_flg指定SEM_UNDO,Linux會在進程退出的時候自動撤銷該次操作。 代碼 5.4 展示了二元信號量的等待和投遞操作。
代碼 5.4 (sem_pv.c)二元信號量等待和投遞操作
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* 等待一個二元信號量。阻塞直到信號量的值為正,然後將其減1 */
int binary_semaphore_wait (int semid)
{
struct sembuf operations[1];
/* 使用(且僅使用)第一個信號量 */
operations[0].sem_num = 0;
/* 減一。 */
operations[0].sem_op = -1;
/* 允許撤銷操作 */
operations[0].sem_flg = SEM_UNDO;
return semop (semid, operations, 1);
}
/* 對一個二元信號量執行投遞操作:將其值加一。 這個操作會立即返回。*/
int binary_semaphore_post (int semid)
{
struct sembuf operations[1];
/* 使用(且僅使用)第一個信號量 */
operations[0].sem_num = 0;
/* 加一 */
operations[0].sem_op = 1;
/* 允許撤銷操作 */
operations[0].sem_flg = SEM_UNDO;
return semop (semid, operations, 1);
}
指定 SEM_UNDO 標志解決當出現一個進程仍然持有信號量資源時被終止這種特殊情況時可能出現的資源泄漏問題。當一個進程被有意識或者無意識地結束的時候,信號量的值會被調整到「撤銷」了所有該進程執行過的操作後的狀態。例如,如果一個進程在被殺死之前減小了一個信號量的值,則該信號量的值會增長。

Ⅸ Linux進程間通信的方式有哪些

第一種:管道通信
兩個進程利用管道進行通信時,發送信息的進程稱為寫進程;接收信息的進程稱為讀進程。管道通信方式的中間介質就是文件,通常稱這種文件為管道文件,它就像管道一樣將一個寫進程和一個讀進程連接在一起,實現兩個進程之間的通信。寫進程通過寫入端往管道文件中寫入信息;讀進程通過讀出端從管道文件中讀取信息。兩個進程協調不斷地進行寫和讀,便會構成雙方通過管道傳遞信息的流水線。
第二種:消息緩沖通信
多個獨立的進程之間可以通過消息緩沖機制來相互通信。這種通信的實現是以消息緩沖區為中間介質,通信雙方的發送和接收操作均以消息為單位。在存儲器中,消息緩沖區被組織成隊列,通常稱之為消息隊列。消息隊列一旦創建後即可由多進程共享,發送消息的進程可以在任意時刻發送任意個消息到指定的消息隊列上,並檢查是否有接收進程在等待它所發送的消息。若有則喚醒它,而接收消息的進程可以在需要消息的時候到指定的消息隊列上獲取消息,如果消息還沒有到來,則轉入睡眠等待狀態。
第三種:共享內存通信
針對消息緩沖需要佔用CPU進行消息復制的缺點,OS提供了一種進程間直接進行數據交換的通信方式。共享內存,顧名思義這種通信方式允許多個進程在外部通信協議或同步,互斥機制的支持下使用同一個內存段進行通信,它是一種最有效的數據通信方式,其特點是沒有中間環節,直接將共享的內存頁面通過附接映射到相互通信的進程各自的虛擬地址空間中,從而使多個進程可以直接訪問同一個物理內存頁面。

熱點內容
加密ovpn 發布:2025-05-12 12:01:55 瀏覽:44
python練手項目 發布:2025-05-12 11:14:07 瀏覽:122
壓縮聽算音頻 發布:2025-05-12 10:58:12 瀏覽:801
資料庫系統報告 發布:2025-05-12 10:43:17 瀏覽:603
日產高配有哪些配置 發布:2025-05-12 10:32:16 瀏覽:475
大眾朗逸哪個配置值得入手 發布:2025-05-12 10:31:20 瀏覽:505
壓縮包的後綴 發布:2025-05-12 10:20:35 瀏覽:944
煙台招聘編程 發布:2025-05-12 10:04:21 瀏覽:53
sql查詢所有表名 發布:2025-05-12 10:01:28 瀏覽:666
用python編譯器的簡單代碼 發布:2025-05-12 09:48:40 瀏覽:358