C語(yǔ)言實(shí)現(xiàn)進(jìn)程間通信原理解析
最近學(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)程訪問(wèn),能實(shí)現(xiàn)互斥;
pipe(int fd[] ), 其參數(shù)為長(zhǎng)度為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ù)具體用法,可見(jiàn)鏈接,講述的很詳細(xì)了;
具體思路:
一:實(shí)現(xiàn)進(jìn)程間的通信,無(wú)非就是各進(jìn)程間數(shù)據(jù)的交流,傳輸;
1、shm_open()函數(shù)是創(chuàng)建或打開一個(gè)已存在(唯一的name)的共享內(nèi)存,返回文件描述符,可以看作是創(chuàng)建或打開了一個(gè)文件,說(shuō)法不同而已
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ū)訪問(wèn)共享資源時(shí),其他進(jìn)程不能進(jìn)入該臨界區(qū)訪問(wèn)任何共享資源
臨界區(qū)代表進(jìn)程將訪問(wèn)共享資源的一段代碼
當(dāng)我們?cè)谙蚬蚕韰^(qū)寫入數(shù)據(jù)時(shí),顯然不想多個(gè)進(jìn)程同時(shí)訪問(wèn),因?yàn)闀?huì)造成不必要的麻煩,就需要信號(hào)量來(lái)實(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)程正在訪問(wè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ù)具體用法,可見(jiàn)鏈接,講述的很詳細(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)程無(wú)需在進(jìn)行打開操作,可直接使用
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解
- C語(yǔ)言中進(jìn)程間通訊的方式詳解
- C語(yǔ)言超詳細(xì)分析多進(jìn)程的概念與使用
- 詳解C語(yǔ)言進(jìn)程同步機(jī)制
- C語(yǔ)言實(shí)現(xiàn)查看進(jìn)程是否存在的方法示例
- C語(yǔ)言中查詢進(jìn)程信號(hào)是否被遮罩或擱置的簡(jiǎn)單方法
- C語(yǔ)言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解
- C語(yǔ)言中操作進(jìn)程信號(hào)的相關(guān)函數(shù)使用詳解
- C語(yǔ)言控制進(jìn)程之進(jìn)程等待詳解
相關(guān)文章
C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)平衡二叉樹實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)平衡二叉樹實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++進(jìn)階練習(xí)刪除鏈表的倒數(shù)第N個(gè)結(jié)點(diǎn)詳解
這篇文章主要給大家介紹了關(guān)于如何利用C++刪除鏈表的倒數(shù)第N個(gè)結(jié)點(diǎn),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-05-05詳解C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01C語(yǔ)言回調(diào)函數(shù)的簡(jiǎn)單運(yùn)用
回調(diào)函數(shù)就是函數(shù)指針變量作為另外一個(gè)函數(shù)的參數(shù)而使用的一種應(yīng)用情形。本文就詳細(xì)的介紹一下C語(yǔ)言回調(diào)函數(shù)的簡(jiǎn)單運(yùn)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09C++ xxx_cast實(shí)現(xiàn)轉(zhuǎn)換代碼實(shí)例解析
這篇文章主要介紹了C++xxx_cast轉(zhuǎn)換代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07C++在非面向?qū)ο蠓矫鎸?duì)C語(yǔ)言的擴(kuò)充
C++是一種面向?qū)ο缶幊陶Z(yǔ)言,但它也可以作為C語(yǔ)言的擴(kuò)展語(yǔ)言。在C++中,我們可以使用非面向?qū)ο蠓矫娴奶匦詠?lái)擴(kuò)展C語(yǔ)言。在本文中,我們將討論C++在非面向?qū)ο蠓矫鎸?duì)C語(yǔ)言的擴(kuò)充2023-05-05