linux的程序通訊:訊號量例項(C語言)
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- union semun
- {
- int val;
- struct semid_ds *buf;
- unsigned shortint *array;
- struct seminfo *__buf;
- };
- int main(
- {
- char* buf_child[]={"this", "is", "the", "child", "process"};
- char* buf_father[]={"father", "say", "hello", "to", "child"};
- int i = 0, semid, fd;
- pid_t pid;
- struct sembuf sb; //訊號量操作
- union semun sem;
- semid = semget(1000, 2, 0666 | IPC_CREAT); //申請訊號量組,包含2個訊號量
- sem.val = 0;
- semctl(semid, 0, SETVAL, sem); //初始化0號訊號量為0
- sem.val = 1;
- semctl(semid, 1, SETVAL, sem); //初始化1號訊號量為1
- fd=open("tmp",O_CREAT|O_TRUNC|O_WRONLY,0666);
- pid = fork();
- switch (pid) {
- case -1:
- perror("fork fail");
- break;
- case 0: /* child consume */
- srand((unsigned int)getpid());
- while (i < 5) {
- sb.sem_num = 1; //將1號訊號量
- sb.sem_op = -1; //減1
- sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
- semop(semid, &sb, 1);
- write(fd,buf_child[i], strlen(buf_child[i]));
- sleep(rand());
- write(fd,&" ", 1);
- i++;
- sb.sem_num = 0; //將0號訊號量
- sb.sem_op = 1; //加1
- sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
- semop(semid, &sb, 1); //操作訊號量
- }
- break;
- default:/* parent production */
- srand((unsigned int)getpid());
- while (i < 5) {
- sb.sem_num = 0; //將0號訊號量
- sb.sem_op = -1; //減1
- sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
- semop(semid, &sb, 1); //操作訊號量
- write(fd,buf_father[i], strlen(buf_father[i]));
- sleep(rand());
- write(fd,&" ", 1);
- i++;
- sb.sem_num = 1;
- sb.sem_op = 1;
- sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
- semop(semid, &sb, 1);
- }
- break;
- }
- return 0;
- }
相關推薦
linux的程序通訊:訊號量例項(C語言)
這篇發的很糾結,這不是我原創的程式碼,是同學寫的,我只是想在這記錄下來,以後沒事可以看看,寫轉載嘛,又沒有轉載的來源,翻譯就更扯了,勉強寫個原創,其實不是我原創啦。 ( ̄▽ ̄)" 有興趣可以看下,這是關於linux中的訊號量的使用的一篇文章。我加了一些註釋。 題目是:寫一個程式,該程式建立兩個程序,分
演算法3-2:行編輯程式 (c語言)
: 演算法3-2:行編輯程式 時間限制:1 Seconds 記憶體限制:32 Mbyte 總提交:65 正確:9 作者:外部匯入 [提交] [統計] [提問] 題目描述 一個簡單的行編輯程式的功能是:接收使用者從終端輸入的程式或資料,並存入使用者的資料區。由於使用者在終端上進
PTA練習:找完數(C語言)
所謂完數就是該數恰好等於除自身外的因子之和。例如:6=1+2+3,其中1、2、3為6的因子。本題要求編寫程式,找出任意兩正整數m和n之間的所有完數。 輸入格式: 輸入在一行中給出2個正整數m和n(1<m≤n≤10000),中間以空格分隔。 輸出格式: 逐行輸出給定範
LeetCode第二題:兩樹相加(C語言)
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2 -> 4 -> 3) + (5 -> 6
HDoj:2040 親和數(C語言)
這個題比較簡單,只需要利用迴圈找出A、B的真約數,然後相加進行判斷,是否兩個數中的任何一個數都是另一個數的真約數之和,如果是就輸出YES,否則輸出NO。下面貼上已AC的C語言程式碼:#include<stdio.h>#include<math.h>in
Linux程序間通訊:訊號量 semget()、semop()、semctl()
這篇文章將講述別一種程序間通訊的機制——訊號量。注意請不要把它與之前所說的訊號混淆起來,訊號與訊號量是不同的兩種事物。有關訊號的更多內容,可以閱讀我的另一篇文章:Linux程序間通訊 -- 訊號。下面就進入訊號量的講解。 一、什麼是訊號量 為了防止出現
作業系統(11)程序--程序通訊:訊號、管道、訊息佇列、共享記憶體
文章目錄 1. 程序通訊相關概念 1. 通訊流程、屬性、鏈路 2. 程序通訊方式:直接通訊、間接通訊 2. 程序通訊的機制 1. 訊號 2. 管道 3. 訊息佇列
Linux 程序通訊之 ——訊號和訊號量總結
現在最常用的程序間通訊的方式有:訊號,訊號量,訊息佇列,共享記憶體。 所謂程序通訊,就是不同程序之間進行一些"接觸",這種接觸有簡單,也有複雜。機制不同,複雜度也不一樣。通訊是一個廣義上的意義,不僅僅指傳遞一些massege。他們的使用方法是基本相同的,所以只要
linux系統——IPC程序通訊之訊號量
一、訊號量引出 當我們編寫的程式使用執行緒的時候,總是有一部分臨街程式碼,需要確保只有一個程序(或一個執行緒)可以進入這個臨街程式碼並擁有對資源的獨佔式訪問 ——》檔案鎖,提供了一個原子化的檔案建立方法,它允許一個程序通過一個令牌(新建立的檔案)來取得成功,這個
Linux-程序通訊-管道/訊號
pipe 無名管道,只能用於親緣關係的程序間通訊,半雙工,固定讀fd[0],寫fd[1],檔案I/O實現; 當管道中午資料時,讀阻塞; 當寫緩衝區滿時又不被讀走,此時寫阻塞;  
linux程序控制之訊號量 semget,semctl,semop
轉載自 https://www.cnblogs.com/52php/p/5851570.html 這篇文章將講述別一種程序間通訊的機制——訊號量。注意請不要把它與之前所說的訊號混淆起來,訊號與訊號量是不同的兩種事物。有關訊號的更多內容,可以閱讀我的另一篇文章:L
【Java併發程式設計】之二十三:併發新特性—訊號量Semaphore(含程式碼)
在作業系統中,訊號量是個很重要的概念,它在控制程序間的協作方面有著非常重要的作用,通過對訊號量的不同操作,可以分別實現程序間的互斥與同步。當然它也可以用於多執行緒的控制,我們完全可以通過
linux程序通訊:使用posix訊息佇列mq進行執行緒或程序間的通訊
POSIX訊息佇列允許程序以訊息的形式交換資料。此API與System V訊息佇列(msgget(2),msgsnd(2),msgrcv(2)等)有明顯不同,但做的事情差不多。 在linux多執行緒程式設計中,如果兩個執行緒沒用共同的資料區,則需要使用訊息佇列從一個執行
Linux程序通訊之訊號
文章轉自 http://blog.csdn.net/maimang1001/article/details/16906451 鑑於後面把程序的形象給徹底毀掉了,我提前宣告一下,程序是有尊嚴的有節操的,當然大部分人可能也看不到毀形象那一段。為什麼介紹linux要從訊號
【Java併發程式設計】之二十三:併發新特性—訊號量Semaphore(含程式碼)(r)
執行緒pool-1-thread-1獲得許可:0 執行緒pool-1-thread-1釋放許可:0 當前允許進入的任務個數:5 執行緒pool-1-thread-2獲得許可:1 執行緒pool-1-thread-6獲得許可:5 執行緒pool-1-thread-4獲得許可:3 執行緒pool-1-thread
Linux核心通訊之---proc檔案系統(詳解)
使用 /proc 檔案系統來訪問 Linux 核心的內容,這個虛擬檔案系統在核心空間和用戶空間之間打開了一個通訊視窗: /proc 檔案系統是一個虛擬檔案系統,通過它可以使用一種新的方法在 Linux核心空間和使用者間之間進行通訊。在 /proc 檔案系統中,我
自己主動化測試程序之中的一個自己定義鍵盤的模擬測試程序(C語言)
nds per oid 尾指針 應用 tro scan number 實現 一、測試程序編寫說明 我們做的終端設備上運行的是QT應用程序。使用自己定義的鍵盤接口。經過測試人員長時間的人機交互測試,來確認系統的功能是否滿足需求。如今須要編寫一個自己主動化
3、簡單計算機程序(C語言)
can ext class log cnblogs c語言 輸入 char 計算機程序 簡單計算機程序 程序代碼: /* 2017年6月30日15:35:14 功能:計算器程序,輸入兩個運算數與四則運算符,輸出計算結果 */ # include <stdio.h
單片機課程設計-四位加法計算器設計參考程序(c語言)
判斷 變量 課程設計 命令 sign 個性 乘法 一行 數據 1 #include<reg52.h> 2 typedef unsigned char uint8; 3 typedef unsigned int uint16
資料結構實現(六):連結串列棧(C++版)
資料結構實現(六):連結串列棧(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 入棧操作 2.2 出棧操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析 3.1