Linux 進程間通訊 --共享內存

1、什麼是共享內存
    共享內存就是容許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在運行的進程之間共享和傳遞數據的一種很是有效的方式。不一樣進程之間共享的內存一般安排爲同一段物理內存。進程能夠將同一段共享內存鏈接到它們本身的地址空間中,全部進程均可以訪問共享內存中的地址,就好像它們是由用C語言函數malloc分配的內存同樣。而若是某個進程向共享內存寫入數據,所作的改動將當即影響到能夠訪問同一段共享內存的任何其餘進程。
   注意:共享內存並未提供同步機制,也就是說,在第一個進程結束對共享內存的寫操做以前,並沒有自動機制能夠阻止第二個進程開始對它進行讀取。因此咱們一般須要用其餘的機制來同步對共享內存的訪問,例如前面說到的信號量。
2、實現步驟
  1.建立共享內存  shmget
  2.映射共享內存 shmat ,將建立的共享內存映射到進程中
  3.解除映射  shmdt
    int shmget(key_t key, size_t size, int shmflg);
      // key的值 0/IPC_PRIVATE  IPC_CREATE時建立一塊內存
      // size  多少字節
      // 標誌
返回共享內存的標識符
 
      void *shmat(int shmid, const void *shmaddr, int shmflg);
      //      建立時返回de 共享內存的標識符
      // flag 決定以什麼方式映射 通常是0
      // addr 
int shmdt(const void *shmaddr);

  linux  中wait用法linux

   進程一旦調用了wait就當即阻塞本身,由wait自動分析是否當前進程的某個子進程已經退出,若是讓它找到了這樣一個已經變成殭屍的子進程,wait就會收集這個子進程的信息,並把它完全銷燬            後返回;若是沒有找到這樣一個子進程,wait就會一直阻塞在這裏,直到有一個出現爲止。函數

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define PERM S_IRUSR|S_IWUSR
/* 共享內存 */

int main(int argc,char **argv) 
{ 
    int shmid; 
    char *p_addr,*c_addr; 
    
    if(argc!=2) 
    { 
        fprintf(stderr,"Usage:%s\n\a",argv[0]); 
        exit(1); 
    }

    /* 建立共享內存 */    
    if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1) 
    { 
        fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno)); 
        exit(1); 
    } 

    /* 建立子進程 */
    if(fork()) // 父進程寫
    { 
        p_addr=shmat(shmid,0,0);   // 傳 0 表明由系統自動給你指定一個地址
        memset(p_addr,'\0',1024); 
        strncpy(p_addr,argv[1],1024);
        wait(NULL); // 釋放資源,不關心終止狀態
        exit(0); 
    } 
    else       // 子進程讀
    { 
        sleep(1); // 暫停1秒        
        c_addr=shmat(shmid,0,0); 
        printf("Client get %p\n",c_addr); 
        exit(0); 
    } 
} 
相關文章
相關標籤/搜索