⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 process.c

📁 liunx下的shell实现;进程、线程同步的实现;I/O系统调用的比较(mmap)——操作系统的课程设计
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <time.h>#include <sys/types.h>#include <linux/sem.h>#define N 6voidupdate_msg (int sem_set_id, int index){struct sembuf sem_op;FILE *file;switch (index){	case 0:printf ("I am process p%d\n", index+1);sem_op.sem_num = index;sem_op.sem_op = 2;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);break;	case 1:sem_op.sem_num = 0;sem_op.sem_op = -1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);printf ("I am process p%d\n", index+1);sem_op.sem_num = 1;sem_op.sem_op = 2;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);break;	case 2:sem_op.sem_num = 0;sem_op.sem_op = -1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);printf ("I am process p%d\n", index+1);sem_op.sem_num = 2;sem_op.sem_op = 1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);break;	case 3:sem_op.sem_num = 1;sem_op.sem_op = -1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);printf ("I am process p%d\n", index+1);sem_op.sem_num = 3;sem_op.sem_op = 1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);break;	case 4:sem_op.sem_num = 1;sem_op.sem_op = -1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);sem_op.sem_num = 2;sem_op.sem_op = -1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);printf ("I am process p%d\n", index+1);sem_op.sem_num = 4;sem_op.sem_op = 1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);break;	case 5:sem_op.sem_num = 3;sem_op.sem_op = -1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);sem_op.sem_num = 4;sem_op.sem_op = -1;sem_op.sem_flg = 0;semop (sem_set_id, &sem_op, 1);printf ("I am process p%d\n", index+1);break;default:break;}}voidprintmsg (int sem_set_id, int index){int i;long j;for (i = 0; i < 3; i++){update_msg (sem_set_id, index);for(j=0;j<1000000;j++);}}intmain (int argc, char *argv[]){int sem_set_id;union semun sem_val;int child_pid;struct sembuf sem_op;int i;int rc;struct timespec delay;sem_set_id = semget (IPC_PRIVATE, 5, IPC_CREAT | 0600);if (sem_set_id == -1){perror ("main: semget");exit (1);}printf ("semaphore set created, semaphore set id '%d'.\n",sem_set_id);sem_val.val = 0;rc = semctl (sem_set_id, 0, SETVAL, sem_val);for (i = 0; i < N; i++){child_pid = fork ();switch (child_pid){case -1:perror ("fork");exit (1);case 0:printmsg (sem_set_id, i);exit (0);break;default:break;}}	for (i = 0; i < N; i++){int child_status;wait (&child_status);}semctl (sem_set_id, 0, IPC_RMID);printf ("main: we're done\n");return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -