📄 jincheng.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 + -