程序間通訊 訊號量

2021-06-18 01:14:37 字數 1761 閱讀 3041

ipc識別符號和關鍵字:

在終端輸入ipcs,可以看到目前系統中所有的ipc資訊:

第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。

ftok()函式用於獲得乙個ipc的關鍵字,其函式原型是:

key_t  ftok(const char *pathname,int proj_id);

下面是乙個訊號量的綜合例項:

#include #include #include #include #include #include #include #include #include #if defined(_gnu_library_)&&!defined(_sem_semun_undefined)

#else

union semun;

#endif

int semheld=0;

int id=0;

void pid_printf(char *format,...)

void sem_release(int id)

sb.sem_num=0;

sb.sem_op=1;

sb.sem_***=sem_undo;

if(semop(id,&sb,1) == -1)

semheld--;

pid_printf("resource released.\n");

}void sem_request(int id)

sb.sem_num=0;

sb.sem_op=-1;

sb.sem_***=sem_undo;

pid_printf("requesting resource...");

fflush(stdout);

if(semop(id,&sb,1) == -1)

semheld++;

printf("done...\n");

}void sem_delete(void)

}int main(int argc,char **argv)

} }else

if(id == -1)

pid_printf("sucessfully allocated semaphore id %d.\n",id);

while(1) }

return 0;

}

測試這個程式,需要分別在兩個終端進行操作。現在第乙個終端執行程式,並選擇2申請資源。

螢幕輸出如下:

程序建立了乙個id為65536的訊號量集,並申請了乙個資源。

我們從另乙個終端輸入ipcs 命令可以檢視到這個訊號量集:

在另乙個終端在執行這個程式,把訊號量id作為引數傳入:

選擇2,這事程序會被阻塞,直到另乙個程序把資源釋放掉,切到另乙個終端,輸入1,此時可以看到第二個終端的程式馬上申請到了資源。

程序間通訊 訊號量

system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...

程序間通訊 訊號量

訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...

程序間通訊 訊號量

訊號量與已經介紹過的ipc機構 管道 fifo以及訊息列隊 不同。它是乙個計數器,用於多程序對共享資料物件的訪問。為了獲得共享資源,程序需要執行下列操作 1 測試控制該資源的訊號量。2 若此訊號量的值為正,則程序可以使用該資源。程序將訊號量值減1,表示它使用了乙個資源單位。3 若此訊號量的值為0,則...