jincheng.c

来自「进程的同步与互斥」· C语言 代码 · 共 88 行

C
88
字号
#include<stdio.h>
#include<stdib.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_name_path,int number){  struct sembuf sem_op;  FILE *file;//相当于执行P操作,申请文件  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_name_path,"w");  if(file){       fprintf(file,"%d\n",number);       printf("%d\n",number);       fclose(file);     }//相当于执行V操作,释放文件的使用权  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_se_id,file_name,pid);           for(j=0,j<200000;j++);/*暂停一段时间*/  }}//主函数int main(int argc,char **argv){ int sem_set_id,child_pid; union semun sem_val; int i,rc;//创建一个信号量集合,标识为225,只有一个信号量 sem_set_id==-1){    perror("main's semget error ");    exit(1);  }//把该信号量的值设置为1 sem_val.val=1; rc=semctl(sem_set_id,0,SETVAL,sem_val); if(rc==-1){     perror("main: setctl");      exit(1);//建立一些子进程,以便竞争并互斥地向文件中写 for(i=0;i<NUM_PROCS;i++){      child_pid=fork();      case -1;         perror("fork()");         exit(1);      case 0;         do_child_loop(sem_set_id,FILE_NAME);         exit(0);          default:break;     } }//创建子进程的循环结束//父进程等待子进程结束 for(i=0;i<10;i++){     int child_status;     wait(&child_status);   }  printf("main is done");  fflush(stdout);  return 0;}

⌨️ 快捷键说明

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