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

📄 jincheng.c

📁 进程的同步与互斥
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -