?? semaphore.c
字號:
/* File: semaphore.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <sys/types.h> #include <sys/wait.h> #include <linux/sem.h> #define NUM_PROCS 5 #define SEM_ID 250 #define FILE_NAME "/tmp/sem_mutex" #define DELAY 400000 void update_file(int sem_set_id, char* file_path, int number) { struct sembuf sem_op; FILE* file; //等待信號燈的數值變為非負數 sem_op.sem_num = 0; sem_op.sem_op = -1; sem_op.sem_flg = 0; semop(sem_set_id, &sem_op, 1); //寫如文件, 寫入的數值是當前進程的進程號 file = fopen(file_path, "w"); if (file) { fprintf(file, "%d\n", number); printf("%d\n", number); fclose(file); } //發送信號, 把信號燈的數值加1 sem_op.sem_num = 0; sem_op.sem_op = 1; sem_op.sem_flg = 0; semop(sem_set_id, &sem_op, 1); } //子進程寫文件 void do_child_loop(int sem_set_id, char* file_name) { pid_t pid = getpid(); int i, j; for (i=0; i<3; i++) { update_file(sem_set_id, file_name, pid); for (j=0; j<400000; j++) ; } } int main(int argc, char **argv) { int sem_set_id; //信號燈集的ID union semun sem_val; //信號燈的數值, 用于 semctl() int child_pid; //子進程的進程號 int i; int rc; //建立信號燈集, ID是250, 其中只有一個信號燈 sem_set_id = semget(SEM_ID, 1, IPC_CREAT | 0600); if (sem_set_id == -1) { perror("main: semget"); exit(1); } //把第一個信號燈的數值設置為1 sem_val.val = 1; rc = semctl(sem_set_id, 0, SETVAL, sem_val); if (rc == -1) { perror("main: semctl"); exit(1); } //建立一些子進程, 使它們可以同時以競爭的方式訪問信號燈 for (i=0; i<NUM_PROCS; i++) { child_pid = fork(); switch(child_pid) { case -1: perror("fork"); exit(1); case 0: //子進程 do_child_loop(sem_set_id, FILE_NAME); exit(0); default: //父進程接著運行 break; } } //等待子進程結束 for (i=0; i<NUM_PROCS; i++) { int child_status; wait(&child_status); } printf("main: we're done\n"); fflush(stdout); return 0; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -