最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)進(jìn)程間通信原理解析

 更新時(shí)間:2020年06月15日 16:05:29   投稿:yaominghui  
這篇文章主要介紹了C語言實(shí)現(xiàn)進(jìn)程間通信原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

最近學(xué)習(xí)了操作系統(tǒng)的并發(fā);以下是關(guān)于進(jìn)程間實(shí)現(xiàn)并發(fā),通信的兩個(gè)方法。

1:利用管道進(jìn)行進(jìn)程間的通信

用到下列函數(shù)

  • pipe() from unistd.h
  • sleep()
  • write(), read()
  • fork(); //創(chuàng)建子進(jìn)程

管道只能用于具有親緣關(guān)系的進(jìn)程,可以將其看作一個(gè)文件,但有別于普通的文件, 管道一次只可以被一個(gè)進(jìn)程訪問,能實(shí)現(xiàn)互斥;

pipe(int fd[] ), 其參數(shù)為長度為2的int數(shù)組,分別代表讀端fd[0], 寫端fd[1], 在創(chuàng)建管道后,f d[0],fd[1]成為文件描述符;

寫入(write)管道一端fd[1]的數(shù)據(jù),在管道的另一端fd[0]可以被進(jìn)程讀取(read);

代碼

2:利用共享內(nèi)存實(shí)現(xiàn)通信, 信號(hào)量實(shí)現(xiàn)互斥

共享內(nèi)存使用了以下函數(shù):

int shm_open(const char *name, int oflag, mode_t mode);  //創(chuàng)建或打開共享內(nèi)存, 返回文件描述符

int ftruncate(int fd, off_t FILE_SIZE);  //調(diào)整共享內(nèi)存空間大小

void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) //將文件映射到進(jìn)程的地址空間,返回指向地址空間的指針

int munmap(void *start, size_t length); //解除地址映射

int shm_unlink(const char *name); //刪除shm_open()創(chuàng)建的共享內(nèi)存

函數(shù)具體用法,可見鏈接,講述的很詳細(xì)了;

具體思路:

一:實(shí)現(xiàn)進(jìn)程間的通信,無非就是各進(jìn)程間數(shù)據(jù)的交流,傳輸;

1、shm_open()函數(shù)是創(chuàng)建或打開一個(gè)已存在(唯一的name)的共享內(nèi)存,返回文件描述符,可以看作是創(chuàng)建或打開了一個(gè)文件,說法不同而已

2、ftruncate()函數(shù)用于指定文件(fd)有多大

3、關(guān)鍵步驟就是mmap(),它將指定的文件(fd)或其他對(duì)象映射到內(nèi)存, 得到可以直接操作的指針對(duì)象,不需調(diào)用write, read等

4、然后就是在使用完成后需要解除映射munmap(), 和刪除創(chuàng)建的共享內(nèi)存(name)shm_unlink(),; 對(duì)于做打開共享內(nèi)存操作的進(jìn)程,也需要執(zhí)行這些操作(1,2,3,4)

二:然后使用信號(hào)量實(shí)現(xiàn)互斥:

互斥的意思為:當(dāng)一個(gè)進(jìn)程在臨界區(qū)訪問共享資源時(shí),其他進(jìn)程不能進(jìn)入該臨界區(qū)訪問任何共享資源

臨界區(qū)代表進(jìn)程將訪問共享資源的一段代碼

當(dāng)我們?cè)谙蚬蚕韰^(qū)寫入數(shù)據(jù)時(shí),顯然不想多個(gè)進(jìn)程同時(shí)訪問,因?yàn)闀?huì)造成不必要的麻煩,就需要信號(hào)量來實(shí)現(xiàn)這種互斥的機(jī)制

sem_t *sem_open(const char *name,int oflag, mode_t mode,unsigned int value)  //創(chuàng)建或打開一個(gè)存在的(name)信號(hào)量

int sem_wait(sem_t *sem) // 使信號(hào)量(value)減1,若信號(hào)量小于0,則阻塞執(zhí)行semwait()的進(jìn)程

臨界區(qū)代碼一般存在于這兩個(gè)調(diào)用之間,比如:當(dāng)前進(jìn)程向共享區(qū)寫數(shù)據(jù),如受到sem_wait阻塞,表示資源已經(jīng)用盡或其他進(jìn)程正在訪問,需等待

int sem_post(sem_t *sem) // 當(dāng)前進(jìn)程離開臨界區(qū)時(shí),使信號(hào)量(value)加1,

int sem_unlink(count char *name) //刪除信號(hào)量

函數(shù)具體用法,可見鏈接,講述的很詳細(xì)了;

代碼

需要注意的是:

1:在使用共享內(nèi)存和信號(hào)量時(shí)要注意,有些調(diào)用是使用的共享內(nèi)存和信號(hào)量的name, 但有些是使用的創(chuàng)建或打開他們的返回值(fd和sem_t*)

2:如在子進(jìn)程創(chuàng)建之前,父進(jìn)程已創(chuàng)建了共享內(nèi)存或信號(hào)量,則子進(jìn)程無需在進(jìn)行打開操作,可直接使用

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言中壓縮字符串的簡單算法小結(jié)

    C語言中壓縮字符串的簡單算法小結(jié)

    這篇文章主要介紹了C語言中可用于實(shí)現(xiàn)字符串壓縮的簡單算法小結(jié),列舉了包括哈夫曼算法等三個(gè)核心的程序?qū)崿F(xiàn)算法,需要的朋友可以參考下
    2016-03-03
  • C++ OpenCV模擬實(shí)現(xiàn)微信跳一跳

    C++ OpenCV模擬實(shí)現(xiàn)微信跳一跳

    這篇文章主要介紹了使用C++和OpenCV模擬實(shí)現(xiàn)微信跳一跳功能,本文圖文并茂通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 帶你從頭學(xué)習(xí)C++的封裝

    帶你從頭學(xué)習(xí)C++的封裝

    這篇文章主要為大家從頭學(xué)習(xí)了C++的封裝,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c++實(shí)現(xiàn)跳躍表(Skip List)的方法示例

    c++實(shí)現(xiàn)跳躍表(Skip List)的方法示例

    跳表(skiplist)是一個(gè)非常優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)簡單,插入、刪除、查找的復(fù)雜度均為O(logN),下面這篇文章主要介紹了c++實(shí)現(xiàn)跳躍表(Skip List)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的示例詳解

    C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2024-03-03
  • 解析bitmap處理海量數(shù)據(jù)及其實(shí)現(xiàn)方法分析

    解析bitmap處理海量數(shù)據(jù)及其實(shí)現(xiàn)方法分析

    本篇文章是對(duì)bitmap處理海量數(shù)據(jù)及其實(shí)現(xiàn)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決

    QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決

    本文主要介紹了QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • VC++基于Dx實(shí)現(xiàn)的截圖程序示例代碼

    VC++基于Dx實(shí)現(xiàn)的截圖程序示例代碼

    這篇文章主要介紹了VC++基于Dx實(shí)現(xiàn)的截圖程序示例代碼,比較實(shí)用的功能,需要的朋友可以參考下
    2014-07-07
  • C語言舉例講解轉(zhuǎn)義字符的使用

    C語言舉例講解轉(zhuǎn)義字符的使用

    轉(zhuǎn)義字符是很多程序語言、數(shù)據(jù)格式和通信協(xié)議的形式文法的一部分。對(duì)于一個(gè)給定的字母表,一個(gè)轉(zhuǎn)義字符的目的是開始一個(gè)字符序列,使得轉(zhuǎn)義字符開頭的該字符序列具有不同于該字符序列單獨(dú)出現(xiàn)(沒有轉(zhuǎn)義字符開頭)時(shí)的語義。因此轉(zhuǎn)義字符開頭的字符序列被叫做轉(zhuǎn)義序列
    2022-05-05
  • Qt自定義控件實(shí)現(xiàn)進(jìn)度儀表盤

    Qt自定義控件實(shí)現(xiàn)進(jìn)度儀表盤

    這篇文章主要介紹了Qt自定義控件實(shí)現(xiàn)進(jìn)度儀表盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評(píng)論

天镇县| 九寨沟县| 明水县| 潜江市| 陇南市| 亳州市| 成武县| 蒙山县| 德保县| 永新县| 兴宁市| 乐安县| 新宁县| 阳西县| 东山县| 德庆县| 无为县| 宁晋县| 巧家县| 汉源县| 沂水县| 义乌市| 虎林市| 福贡县| 宣威市| 海安县| 洪江市| 方正县| 河津市| 舞阳县| 和田县| 上高县| 平陆县| 沈丘县| 临泽县| 北辰区| 阳朔县| 镇宁| 乡宁县| 监利县| 渭南市|