semget建立檔案 linux訊號燈操作

2021-10-16 14:29:16 字數 2606 閱讀 3133

訊號量:乙個整數;

大於或等於0時代表可供併發程序使用的資源實體數;

小於0時代表正在等待使用臨界區的程序數;

用於互斥的訊號量初始值應大於0;

只能通過p、v原語操作而改變;

訊號量元素組成:

1、表示訊號量元素的值;

2、最後操作訊號量元素的程序id

3、等待訊號量元素值+1的程序數;

4、等待訊號量元素值為0的程序數;

semop操作中:sembuf結構的sem_***成員可以為0、ipc_nowait、sem_undo 。為sem_undo時,它將使作業系統跟蹤當前程序對這個訊號量的修改情況,如果這個程序在沒有釋放該訊號量的情況下終止,作業系統將自動釋放該程序持有的訊號量。除非你對訊號量的行為有特殊的要求,否則應該養成設定sem_***為sem_undo的好習慣。

二、主要函式

1.1 建立訊號量

int semget(

key_t key, //標識訊號量的關鍵字,有三種方法:1、使用ipc——private讓系統產生,

// 2、挑選乙個隨機數,3、使用ftok從檔案路徑名中產生

int nsemes, //訊號量集中元素個數

int flag //ipc_creat;ipc_excl 只有在訊號量集不存在時建立

成功:返回訊號量控制代碼

失敗:返回-1

1.2 使用ftok函式根據檔案路徑名產生乙個關鍵字

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

路徑名稱必須有相應許可權

1.3 控制訊號量

int semctl(

int semid, //訊號量集的控制代碼

int semnum, //訊號量集的元素數

int cmd, //命令

/*union senum arg */... //

成功:返回相應的值

失敗:返回-1

命令詳細說明:

cmd: ipc_rmid 刪除乙個訊號量

ipc_excl 只有在訊號量集不存在時建立

ipc_set 設定訊號量的許可權

setval 設定指定訊號量的元素的值為 agc.val

getval 獲得乙個指定訊號量的值

getpid 獲得最後操縱此元素的最後程序id

getncnt 獲得等待元素變為1的程序數

getzcnt 獲得等待元素變為0的程序數

union senum 定義如下:

union senumagc;

其中 semid_ds 定義如下:

struct semid_ds arg;

//生成訊號量

int sem_creat(key_t key)

union semun sem;

int semid;

sem.val = 0;

semid = semget(key,1,ipc_creat|0666);

if (-1 == semid);

return (semop(semid,&sops,1));

//vint v(int semid)

struct sembuf sops=;

return (semop(semid,&sops,1));

int main()

key_t key;

int shmid,semid;

char *shm;

char msg[7] = "-data-";

char i;

struct semid_ds buf;

key = ftok("/",0);

shmid = shmget(key,segsize,ipc_creat|0604);

if (-1 == shmid) arg;

// 列印程式執行時間

void out_time(void)

static long start = 0;

time_t tm;

if (0 == start);

semop(semid,&sops,1);

int main(void)

key_t key;

int shmid,semid;

char *shm;

char msg[100];

char i;

key = ftok("/",0);

shmid = shmget(key,segsize,0);

if(-1 == shmid){

printf(" create shared memory error\n");

return -1;

shm = (char *)shmat(shmid,0,0);

if (-1 == (int)shm){

printf(" attach shared memory error\n");

return -1;

semid = new_sem(key);

for (i = 0;i < 3;i ++){

sleep(2);

wait_v(semid);

printf("message geted is: %s \n",shm + 1);

out_time();

semget建立檔案 山大作業系統實驗4

int sem p int semid,int index buf.sem num index if semop semid,buf,1 1 buf.sem num index if semop semid,buf,1 1 perror a wrong operation to semaphore ...

linux建立檔案

1 在 linux 上使用重定向符 建立乙個檔案 標準重定向符允許我們建立乙個 0kb 的空檔案。它通常用於重定向乙個命令的輸出到乙個新檔案中。在沒有命令的情況下使用重定向符號時,它會建立乙個檔案。但是它不允許你在建立檔案時向其中輸入任何文字。然而它對於不是很勤勞的管理員是非常簡單有用的。只需要輸入...

linuv建立檔案的命令 linux 建立檔案命令

vi touch是建立檔案的命令 vi foo.txt cp mv也算是吧,因為cp是拷貝檔案,mv是移動檔案 另外還有好多命令能夠建立檔案,之要該命令能夠重定向輸出到乙個不存在的檔案,就會建立檔案。例如 tail f n 200 usr local tomcat logs catalina.out...