程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux下C編程:共享內存通信實例

Linux下C編程:共享內存通信實例

編輯:關於C語言

共享內存是LUNIX 系統中最底層的通信機制,也是最快速的通信機制。共享內存通過兩個或多個進程共享同一塊內存區域來實現進程間的通信。通常是由一個進程創建一塊共享

內存區域,然後多個進程可以對其進行訪問,一個進程將要傳出的數據存放到共享內存中,另一個或多個進程則直接從共享內存中讀取數據。因此這種通信方式是最高效的進程間通信方式。但實際的問題在於,當兩個或多個進程使用共享內存進行通信時,同步問題的解決顯得尤為重要,否則就會造成因不同進程同時讀寫一塊共享內存中的數據而發生混亂。在通常的情況下,通過使用信號量來實現進程的同步。

以上兩個程序是一個進程間通信的例子。這兩個程序分別在不同的進程中運行,使用了共享內存進行通信。b從鍵盤讀入數據,存放在共享內存中。a則從共享內存中讀取數據,顯示到屏幕上。由於沒有使兩個進程同步,顯示的內容將是雜亂無章的,對這一問題的處理將在進一步學習有關同步的操作之後完成。

實例b程序負責向共享內存中寫入數據,a程序負責從內存中讀出共享的數據,它們之間並沒有添加同步操作。

b.c

#include <sys/types.h>
#include <sys/ipc.h>     
#include <sys/shm.h>     
#include <stdio.h>     

#define BUF_SIZE 1024     
#define MYKEY 25     
int main()     
{     
    int shmid;     
    char *shmptr;     

    if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1)     
    {     
    printf("shmget error \n");     
    exit(1);     
    }     

    if((shmptr =shmat(shmid,0,0))==(void *)-1)     
    {     
    printf("shmat error!\n");     
    exit(1);     
    }     
         
    while(1)     
    {     
    printf("input:");     
    scanf("%s",shmptr);     
    }     

    exit(0);     
}

a.c

#include <stdio.h>     
#include <sys/types.h>
#include <sys/ipc.h>     
#include <sys/shm.h>     

#define BUF_SIZE 1024     
#define MYKEY 25     
int  main()     
{     
    int shmid;     
    char * shmptr;     

    if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1)     
    {     
    printf("shmget error!\n");     
    exit(1);     
    }

    if((shmptr = shmat(shmid,0,0)) == (void *)-1)     
    {     
    printf("shmat error!\n");     
    exit(1);     
    }     

    while(1)     
    {     
    printf("string :%s\n",shmptr);     
    sleep(3);     
    }     

    exit(0);     
}

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved