1. 程式人生 > >linux的程序通訊:訊號量例項(C語言)

linux的程序通訊:訊號量例項(C語言)

 這篇發的很糾結,這不是我原創的程式碼,是同學寫的,我只是想在這記錄下來,以後沒事可以看看,寫轉載嘛,又沒有轉載的來源,翻譯就更扯了,勉強寫個原創,其實不是我原創啦。 ( ̄▽ ̄)" 有興趣可以看下,這是關於linux中的訊號量的使用的一篇文章。我加了一些註釋。

題目是:寫一個程式,該程式建立兩個程序,分別列印"this is the child process"和"father say hello to child",要求交替列印,輸出成"this father is say the hello child to process child",每列印一個單詞程序阻塞一段時間。將輸出列印到當前目錄下的tmp檔案中。

答:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/sem.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. union semun 
  9.     int val; 
  10.     struct semid_ds *buf; 
  11.     unsigned shortint *array; 
  12.     struct seminfo *__buf; 
  13. }; 
  14. int main(
    void
  15.     char* buf_child[]={"this""is""the""child""process"}; 
  16.     char* buf_father[]={"father""say""hello""to""child"}; 
  17.     int i = 0, semid, fd; 
  18.     pid_t pid; 
  19.     struct sembuf sb; //訊號量操作
  20.     union semun sem; 
  21.     semid = semget(1000, 2, 0666 | IPC_CREAT); //申請訊號量組,包含2個訊號量
  22.     sem.val = 0; 
  23.     semctl(semid, 0, SETVAL, sem); //初始化0號訊號量為0
  24.     sem.val = 1; 
  25.     semctl(semid, 1, SETVAL, sem); //初始化1號訊號量為1
  26.     fd=open("tmp",O_CREAT|O_TRUNC|O_WRONLY,0666); 
  27.     pid = fork(); 
  28.     switch (pid) { 
  29.         case -1: 
  30.             perror("fork fail"); 
  31.             break
  32.         case 0: /* child consume */
  33.             srand((unsigned int)getpid()); 
  34.             while (i < 5) { 
  35.                 sb.sem_num = 1; //將1號訊號量
  36.                 sb.sem_op = -1; //減1
  37.                 sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; 
  38.                 semop(semid, &sb, 1); 
  39.                 write(fd,buf_child[i], strlen(buf_child[i])); 
  40.                 sleep(rand()); 
  41.                 write(fd,&" ", 1); 
  42.                 i++; 
  43.                 sb.sem_num = 0; //將0號訊號量
  44.                 sb.sem_op = 1;  //加1
  45.                 sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; 
  46.                 semop(semid, &sb, 1); //操作訊號量
  47.             } 
  48.             break
  49.         default:/* parent production  */
  50.             srand((unsigned int)getpid()); 
  51.             while (i < 5) { 
  52.                 sb.sem_num = 0; //將0號訊號量
  53.                 sb.sem_op = -1; //減1
  54.                 sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; 
  55.                 semop(semid, &sb, 1); //操作訊號量
  56.                 write(fd,buf_father[i], strlen(buf_father[i])); 
  57.                 sleep(rand()); 
  58.                 write(fd,&" ", 1); 
  59.                 i++; 
  60.                 sb.sem_num = 1; 
  61.                 sb.sem_op = 1; 
  62.                 sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; 
  63.                 semop(semid, &sb, 1); 
  64.             } 
  65.             break
  66.     } 
  67.     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

HDoj2040 親和數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