1. 程式人生 > >程序間通訊——訊息傳遞(訊號量同步PV操作)

程序間通訊——訊息傳遞(訊號量同步PV操作)

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]

在多工作業系統環境下,多程序/多執行緒間同時執行,並且這些程序之間存在一定的關聯,多個程序/執行緒可能為了完成同一個任務相互協作,這就是程序之間的同步,訊號量是用來解決程序間同步與互斥的一種程序間通訊機制。

訊號量操作步驟:

一、建立或獲取一個訊號量,呼叫semget()函式。

二、初始化訊號量,呼叫semctl()。

三、進行訊號量的PV操作,呼叫semop()函式。

四、訊號退出時,從系統中刪除該訊號,呼叫semctl(),IPC_RMID操作。

下面程式演示如何在父子程序之間同步:

/*
** 利用訊號量同步程序,可以條件編譯輸出進行對比
*/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#define   DELAY_TIME    3 //延時時間
#define   USEPV         1 //條件編譯

/*某些系統沒有此結構定義,必須自己定義*/
union semun
{
	int val;
	struct semid_ds  *buf;
	unsigned short   *array;
};

/*訊號量初始化函式*/
int init_semid(int sem_id, int init_value)
{
	union semun sem_union;
	sem_union.val = init_value;
	
	//對應引數介紹:訊號編號識別符號,0表示單個訊號,刪除訊號,傳人蔘數
	if(semctl(sem_id, 0, SETVAL, sem_union) == -1)
	{
		perror("Initialize semaphore");
		return -1;
	}
	return 0;
}


/*從系統中傷處訊號量的函式*/
int del_sem(int sem_id)
{
	union semun sem_union;

	if(semctl(sem_id, 0, IPC_RMID, sem_union) == -1)
	{
		perror("Delete semaphore");
		return -1;
	}
	return 0;
}

/*P操作函式*/
int sem_p(int sem_id)
{
	struct sembuf sem_b;
	sem_b.sem_num = 0;        /*單個訊號時為0*/
	sem_b.sem_op = -1;   	  /*P操作,-1是P操作,+1是V操作*/
	sem_b.sem_flg = SEM_UNDO; /*程序退出未釋放時,由系統釋放*/
	
	//引數:訊號識別符號,運算元組,1表示一個操作
	if(semop(sem_id, &sem_b, 1) == -1)
	{
		perror("P operation");
		return -1;
	}
	return 0;
}

/*V操作函式*/
int sem_v(int sem_id)
{
	struct sembuf sem_b;
	sem_b.sem_num = 0;
	sem_b.sem_op = 1;  /*V 操作*/
	sem_b.sem_flg = SEM_UNDO;
	if(semop(sem_id, &sem_b, 1) == -1)
	{
		perror("P operation");
		return -1;
	}
	return 0;
}

int main()
{
	pid_t  result;
	int sem_id;
	
	/*建立一個訊號量*/
	sem_id = semget(ftok(".", 'a'), 1, 0666|IPC_CREAT);
	init_semid(sem_id, 0);
	
	if((result = fork()) == -1)
	{
		perror("fork\n");
	}
	else if(result == 0)   /*子程序*/
	{
		printf("Child process will  wait for some second...\n");
		sleep(DELAY_TIME);
		printf("The returned value is %d in the child process(PID = %d)!\n", result, getpid());
		#if USEPV
		sem_v(sem_id);
		#endif
	}
	else 				  /*父程序*/
	{
		#if USEPV 
		printf("Wait for child sem_v cotrl!\n");
		sem_p(sem_id);
		#endif
		printf("The returned value is %d in the father process(PID = %d)!\n", result, getpid());
		#if USEPV 
		sem_v(sem_id);
		del_sem(sem_id);
		#endif 
	}
	return 0;
}



相關推薦

程序通訊——訊息傳遞(訊號同步PV操作)

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]】 在多工作業系統環境下,多程序/多執行緒間同時執行,並且這些程序之間存在一定的關聯,多個程序/執行緒可能為了完成同一個任務相互協作,這就是程序之間的同步,

程序通訊 記憶體共享訊號例項理解

申請記憶體: int shmget(key_t key, size_t size, int shmflg); 其中key為鑰匙,兩程序通過同一個鑰匙找到核心中的共享記憶體,可通過 key_t ftok(const char *pathname, int proj_id)

Linux(高階程式設計)9————程序通訊6(訊號

訊號量是是什麼? 訊號量是程序間通訊方式之一,用來實現程序間的同步與互斥。訊號量的原理是一種資料操作鎖的概念,它本身不具備資料交換的功能,而是通過控制其他通訊資源(如文字、外部裝置等)來實現程序間通訊。訊號量本身不具備資料傳輸的功能,他只是一種外部資源的標識。 訊號量的本質是:具有等待佇

程序通訊之systemV訊號(semget semop semctl相關操作

一、什麼是訊號量? 訊號量的本質就是計數器,記錄臨界資源的數目,用來協助程序同步互斥的訪問臨界資源。為什麼不在程序中定義一個全域性變數作為計數器呢?兩個程序間的地址空間是各自獨立的,各自有各自的虛擬記憶體空間。多程序之間不能看到各自程序中的全域性變數。(程序間的虛擬記憶體h

程序通訊(IPC)之訊號

★IPC方法包括管道(PIPE)、訊息佇列(Message_Queue)、訊號量(semaphore)、共用記憶體 (ShareMemory)以及套接字(Socket)。程序間通訊主要包括了管道、系統IPC(包括了訊息佇列、訊號以 及共享儲存)、套接字(SOCKET)。此文

易學筆記-系統分析師考試-第3章 作業系統基本原理/3.2 程序管理/3.2.2 訊號PV操作

程序制約方式 間接相互制約:也稱為程序互斥;程序A與程序B都需要資源C(例如印表機),系統已將C分配給A使用,等待A使用完成後系統再將C分配給B使用 直接相互制約:也稱為程序同步;A通過緩衝區向B提供資料,當緩衝區為空時B不能獲取資料而阻塞;當A把資料放入緩衝區後B將被喚醒

程序通訊的方式——訊號、管道、訊息佇列、共享記憶體

多程序: 首先,先來講一下fork之後,發生了什麼事情。 由fork建立的新程序被稱為子程序(child process)。該函式被呼叫一次,但返回兩次。兩次返回的區別是子程序的返回值是0,而父程序的返回值則是新程序(子程序)的程序 id。將子程序id返回給父程序的理由是

php程序通訊--訊息佇列

首先我們來看一下如何建立一個訊息佇列。 //建立訊息佇列 $msg_key = ftok( __FILE__, 'a' ); $msg_queue = msg_get_queue( $msg_key, 0666 );  在php中通過這兩句話就可以建立一個訊息佇列。 ftok 函式,是可以

Linux(高階程式設計)9————程序通訊6(訊號1)

訊號是什麼? 訊號實質是一種軟中斷,用於通知程序發生了某些事件,實際上訊號也可以算作程序間通訊的一種方式,因為我們可在程序通過另一個程序傳送訊號,來告訴另一個程序發生什麼事。 這樣來講我們聽起來可能還會比較暈。 深入理解訊號: 在我們生活中其實就有訊號的

Linux關於程序通訊訊息佇列

訊息佇列概念 訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法 每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值 訊息佇列也有管道一樣的不足,就是每個資料塊的最大長度是有上限的,系統上全體佇列的最大總長度也有一個上限 訊息佇列函式操作

嵌入式Linux併發程式設計,程序通訊方式,訊號訊號機制,檢視新號kill -l,常用訊號,發訊號命令kill [-signal] pid、killall [-u user | prog]

1,訊號機制 訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式 (一個程序在任何條件下,都可以隨時的接收訊號,不需要其他的處理) Linux核心通過訊號通知使用者程序,不同的訊號型別代表不同的事件 Linux對早期的unix訊號機制進行了擴充

python 多程序通訊 訊息佇列

import multiprocessing import time #使用佇列,將訊息寫進佇列,需要的程序到佇列取 #佇列由父程序建立,子程序共享佇列 def write(qe): print("啟動子程序 write") for chr in ['A','B','C','D

Nginx原始碼分析與實踐---程序通訊機制(訊號

在前面我們分析了nginx程序間通訊機制的共享記憶體和套接字。這次我們分析剩下一種程序間通訊機制---訊號。 首先要區分訊號和訊號量:訊號是用於程序間通訊的機制,而訊號量是用於保證共享資源不被併發訪問的機制,如可使用訊號量作為互斥鎖實現多程序下對共享資源的同步。 1.nginx中什

程序通訊——訊息佇列

每個程序各自具有不同的使用者地址空間,任何一個程序的全域性變數在另外一個程序中看不到;所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩

windows執行緒通訊之:訊號

可以描述一個資源有多少。#include "stdafx.h"#include <windows.h>#include <iostream>#include <process.h>using namespace std;CRITICAL_

一步一步學linux之程序通訊——訊息佇列

一、什麼是訊息佇列:訊息佇列提供了一種程序與程序間傳送資料塊的一種方法,每個資料塊含有一個型別,接收程序可以獨立地接收含有不同型別的資料結構,可以通過傳送訊息來避免同步和阻塞問題。訊息佇列有最大長度限制       在分散式計算環境下,訊息佇列是為了對異構網路環境下的分散式應

Linux程序通訊——訊息佇列應用例項

    訊息佇列是訊息的連結表,包括Posix訊息佇列system V訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。下面是兩個測試模組接收模組m

System V程序通訊---訊息佇列

一、訊息佇列模型 訊息佇列是訊息的鏈式佇列,下圖即為訊息佇列模型… 1、訊息佇列的基本屬性 struct msqid_ds { struct msqid_ds { struct ipc_perm msg_perm;

PHP 程序通訊——訊息佇列(msg_queue)

PHP 程序間通訊——訊息佇列 本文不涉及PHP基礎庫安裝。詳細安裝說明,請參考官網,或期待後續部落格分享。 1、訊息佇列函式準備 <?php //生成一個訊息佇列的key $msg_key = ftok(__FILE__, 'a'); //產生一個訊息佇列

linux程序通訊--訊息佇列相關函式(ftok)詳解

ipc_perm中mode的含義 操作者 讀 寫 可讀可寫 使用者 0400 0200 0600 組 0040 0020 0060 其他 0004 0002 0006 5.  IPC物件的建立許可權     msgget、semget、sh