1. 程式人生 > >Linux程序間通訊_IPC機制

Linux程序間通訊_IPC機制

int main(int argc, char *argv[])
{
    key_t key_id;
    key_id = ftok(argv[1], ID);
    if(key_id == -1)
    {
        printf("ftok error.\n");
        exit(1);
    }
    printf("key_id = 0x%x\n", key_id);

    key_t shm_id;
    shm_id = shmget(key_id, 1024, IPC_CREAT|IPC_EXCL|0666);
    if(shm_id == -1)
    {
        printf("shmget error.\n");
        exit(1);
    }


    char *addr;
    addr = (char *)shmat(shm_id,NULL, 0);
    if(addr == (void*)-1)
    {
        printf("shmat error.\n");
        shmctl(shm_id, IPC_RMID, NULL);
        exit(1);
    }

    //////////////////////////////////////////////////////////
    key_t sem_key;
    sem_key = ftok(argv[1],ID1);
    if(sem_key == -1)
    {
        printf("sem ftok error.\n");
        shmctl(shm_id, IPC_RMID, NULL);
        exit(1);
    }
    key_t sem_id = semget(sem_key, 2, IPC_CREAT|IPC_EXCL|0666);
    if(sem_id == -1)
    {
        printf("semget error.\n");
        shmctl(shm_id, IPC_RMID, NULL);
        exit(1);
    }

    union semun init;
    init.val = 0;
    semctl(sem_id, 0, SETVAL, init);
    semctl(sem_id, 1, SETVAL, init);

    struct sembuf p = {0,-1,0};
    struct sembuf v = {1,1,0};
    //////////////////////////////////////////////////////////

    while(1)
    {
        //write
        printf("Ser:>");
        scanf("%s",addr);
        if(strncmp(addr,"quit",4) == 0)
        {
            shmdt(addr);
            shmctl(shm_id, IPC_RMID, NULL);
            semctl(sem_id,0,IPC_RMID);
            semctl(sem_id,1,IPC_RMID);
            break;
        }
        semop(sem_id, &v, 1);   //伺服器端寫資料,然後對sem1
進行V操作


        //read
        semop(sem_id, &p, 1);   //伺服器讀資料之前,先對sem0進行P操作
        printf("Cli:>%s\n",addr);
    }
    return 0;
}

相關推薦

Linux程序通訊_IPC機制

int main(int argc, char *argv[]) {     key_t key_id;     key_id = ftok(argv[1], ID);     if(key_id == -1)     {         printf("ftok error.\n");         ex

linux程序通訊(IPC)機制總結

在linux下的多個程序間的通訊機制叫做IPC(Inter-Process Communication),它是多個程序之間相互溝通的一種方法。在linux下有多種程序間通訊的方法:半雙工管道、命名管道、訊息佇列、訊號、

linux程序通訊的幾種機制的比較及適用場合

用於程序間通訊(IPC)的四種不同技術:  1. 訊息傳遞(管道,FIFO,posix和system v訊息佇列)  2. 同步(互斥鎖,條件變數,讀寫鎖,檔案和記錄鎖,Posix和System V訊號燈)  3. 共享記憶體區(匿名共享記憶體區,有名Posix共享記憶體區,有名System V共享記憶體區)

Linux程序通訊(IPC)方式總結

程序間通訊概述 程序通訊的目的 資料傳輸  一個程序需要將它的資料傳送給另一個程序,傳送的資料量在一個位元組到幾M位元組之間 共享資料  多個程序想要操作共享資料,一個程序對共享資料 通知事件 一個程序需要向另一個或一組程序傳送訊息,通知它(它們)

c/c++ linux 程序通訊系列7,使用pthread mutex

linux 程序間通訊系列7,使用pthread mutex #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/shm.h> #include <pthr

c/c++ linux 程序通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

c/c++ linux 程序通訊系列3,使用socketpair,pipe

linux 程序間通訊系列3,使用socketpair,pipe 1,使用socketpair,實現程序間通訊,是雙向的。 2,使用pipe,實現程序間通訊 使用pipe關鍵點:fd[0]只能用於接收,fd[1]只能用於傳送,是單向的。 3,使用pipe,用標準輸入往裡寫。 疑問:在

linux 程序通訊之FIFO

1.概述 FIFO與管道幾乎類似,所以FIFO也是一個位元組流,從FIFO讀取的順序也是與被寫入FIFO的順序一致,容量是也有限的,也是可以確保寫入不超過PIPE_BUF位元組的操作是原子的,FIFO的本質也是一個管道,但傳遞方向是可以雙向的,它們兩者之間的最大差別在於FIFO在檔案系統中擁有一個名稱,並且

c/c++ linux 程序通訊系列2,使用UNIX_SOCKET

linux 程序間通訊系列2,使用UNIX_SOCKET 1,使用stream,實現程序間通訊 2,使用DGRAM,實現程序間通訊 關鍵點:使用一個臨時的檔案,進行資訊的互傳。 s_un.sun_family = AF_UNIX; strcpy(s_un.sun_path, "

c/c++ linux 程序通訊系列1,使用signal,kill

linux 程序間通訊系列1,使用signal,kill 訊號基本概念:  軟中斷訊號(signal,又簡稱為訊號)用來通知程序發生了非同步事件。程序之間可以互相通過系統呼叫kill傳送軟中斷訊號。核心也可以因為內部事件而給程序傳送訊號,通知程序發生了某個事件。注意,訊號只是用來通知某程序發生了什

Linux程序通訊IPC的幾種方式簡介

Linux程序通訊的源頭       linux下的程序通訊手段基本上是從Unix平臺上的程序通訊手段繼承而來的。而對Unix發展做出重大貢獻的兩大主力AT&T(原為American Telephone & Tele

Linux程序通訊總結

  目錄 訊號 管道 命名管道 System V IPC 組成 識別符號 ftok函式 結構定義 特點 訊息佇列 訊號量 共享記憶體 套接字 Linux下的程序間通訊(Interprocess Communication,

linux 程序通訊方式

1 無名管道通訊 無名管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 2 高階管道通訊 高階管道(popen):將另一個程式當做一個新的程序在當前程式程序中啟動,則它算是當前程式的子程序

Linux 程序通訊的一種實現方式

程序間通訊的方式一般有三種:管道(普通管道、流管道和命名管道)、系統IPC(訊息佇列、訊號和共享儲存)、套接字(Socket) 本部落格以之前所做的智慧車專案為例,簡單介紹下共享儲存的一種實現過程。簡單說來,程序1將資料寫入到一個公共檔案input.txt中,程序2對其進行

Linux 程序通訊(四)訊號量

1 訊號量概述 訊號量和其他IPC不同,並沒有在程序之間傳送資料,訊號量用於多程序在存取共享資源時的同步控制就像交通路口的紅路燈一樣,當訊號量大於0,表示綠燈允許通過,當訊號量等於0,表示紅燈,必須停下來等待綠燈才能通過。 程序間的互斥關係與同步關係存在的根源在於臨界資

Linux 程序通訊(五)IPC的特性

1.識別符號和鍵 每個核心中的IPC結構(訊息佇列、訊號量或共享儲存段)都用一個非負整數的識別符號 (identifier)加以引用。 例如,要向一個訊息佇列傳送訊息或者從一個訊息佇列取訊息,只需要知道其佇列識別符號。 當一個IPC結構被建立,然後又被刪除時,與這種結構

Linux 程序通訊(六)共享記憶體

可以說, 共享記憶體是一種最為高效的程序間通訊方式, 因為程序可以直接讀寫記憶體, 不需要任何資料的複製。 為了在多個程序間交換資訊, 核心專門留出了一塊記憶體區, 這段記憶體區可以由需要訪問的程序將其對映到自己的私有地址空間。 因此, 程序就可以直接讀寫這一記憶體區而不需要

linux程序通訊(IPC)小結

linux IPC型別 1、匿名管道 2、命名管道 3、訊號 4、訊息佇列 5、共享記憶體 6、訊號量 7、Socket 1、匿名管道 過程: 1、管道實質是一個核心緩衝區,先進先出(佇列)讀取緩衝區記憶體資料 2、一個數據只能讀一次,讀完後在緩衝區就不存在

Linux程序通訊方式一:有名管道FIFO

有名管道 我們經常把FIFO稱為有名管道(命名管道)。使用它可以實現兩個不相干的程序之間的通訊。它雖然被稱之為檔案,但是管道檔案在磁碟上只有一個inode結點,這個ionde結點指向的是記憶體中的一塊區域,當A程序建立並使用有名管道時,直接把資料寫入記憶體中,而B程序也是直

Linux程序通訊二:無名管道

無名管道相對於有名管道而言,它不存在管道檔案,它實現程序間通訊的一般方式是藉助父子程序共享fork之前開啟的檔案描述符,所以無名管道只能應用於父子程序間通訊。 無名管道有兩種侷限性 歷史上,無名管道是半雙工通訊的通道,也就是說,一個程序寫的時候,另一個程序只能讀,同時只有