欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1:利用管道進行進程間的通信

用到下列函數(shù)

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

管道只能用于具有親緣關(guān)系的進程,可以將其看作一個文件,但有別于普通的文件, 管道一次只可以被一個進程訪問,能實現(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]可以被進程讀取(read);

代碼

2:利用共享內(nèi)存實現(xiàn)通信, 信號量實現(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 ) //將文件映射到進程的地址空間,返回指向地址空間的指針

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

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

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

具體思路:

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

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

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

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

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

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

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

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

當(dāng)我們在向共享區(qū)寫入數(shù)據(jù)時,顯然不想多個進程同時訪問,因為會造成不必要的麻煩,就需要信號量來實現(xiàn)這種互斥的機制

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

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

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

int sem_post(sem_t *sem) // 當(dāng)前進程離開臨界區(qū)時,使信號量(value)加1,

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

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

代碼

需要注意的是:

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

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

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

相關(guān)文章

  • C語言 數(shù)據(jù)結(jié)構(gòu)平衡二叉樹實例詳解

    C語言 數(shù)據(jù)結(jié)構(gòu)平衡二叉樹實例詳解

    這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)平衡二叉樹實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C/C++ 中extern關(guān)鍵字詳解

    C/C++ 中extern關(guān)鍵字詳解

    這篇文章主要介紹了C/C++ 中extern關(guān)鍵字詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++進階練習(xí)刪除鏈表的倒數(shù)第N個結(jié)點詳解

    C++進階練習(xí)刪除鏈表的倒數(shù)第N個結(jié)點詳解

    這篇文章主要給大家介紹了關(guān)于如何利用C++刪除鏈表的倒數(shù)第N個結(jié)點,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-05-05
  • 深入了解C++智能指針的使用

    深入了解C++智能指針的使用

    智能指針的本質(zhì)就是使用一個對象來接管一段開辟的空間,在該對象在銷毀的時候,自動調(diào)用析構(gòu)函數(shù)來釋放這段內(nèi)存。本文就來和大家詳細(xì)聊聊智能指針的使用,需要的可以參考一下
    2022-10-10
  • 詳解C語言數(shù)據(jù)結(jié)構(gòu)之棧

    詳解C語言數(shù)據(jù)結(jié)構(gòu)之棧

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)之棧,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • OpenCV?通過Mat遍歷圖像的方法匯總

    OpenCV?通過Mat遍歷圖像的方法匯總

    對圖像中的所有點或特殊點進行運算,所以遍歷圖像就顯得很重要,如何高效的遍歷圖像是一個很值得探討的問題,本文給大家?guī)砹硕喾N方法操作OpenCV?通過Mat遍歷圖像,感興趣的朋友一起看看吧
    2022-02-02
  • C++模擬實現(xiàn)list功能

    C++模擬實現(xiàn)list功能

    list的底層是一個循環(huán)雙向鏈表結(jié)構(gòu),雙向鏈表中每個元素存儲在互不相關(guān)的獨立節(jié)點中,在節(jié)點中通過指針指向其前一個元素和后一個元素,接下來通過本文給大家分享C++模擬實現(xiàn)list的示例代碼,需要的朋友可以參考下
    2021-08-08
  • C語言回調(diào)函數(shù)的簡單運用

    C語言回調(diào)函數(shù)的簡單運用

    回調(diào)函數(shù)就是函數(shù)指針變量作為另外一個函數(shù)的參數(shù)而使用的一種應(yīng)用情形。本文就詳細(xì)的介紹一下C語言回調(diào)函數(shù)的簡單運用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++ xxx_cast實現(xiàn)轉(zhuǎn)換代碼實例解析

    C++ xxx_cast實現(xiàn)轉(zhuǎn)換代碼實例解析

    這篇文章主要介紹了C++xxx_cast轉(zhuǎn)換代碼實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • C++在非面向?qū)ο蠓矫鎸語言的擴充

    C++在非面向?qū)ο蠓矫鎸語言的擴充

    C++是一種面向?qū)ο缶幊陶Z言,但它也可以作為C語言的擴展語言。在C++中,我們可以使用非面向?qū)ο蠓矫娴奶匦詠頂U展C語言。在本文中,我們將討論C++在非面向?qū)ο蠓矫鎸語言的擴充
    2023-05-05

最新評論