为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 97
学习任务

北城半夏4806197 的学生作业:

#include #include #include #include #include #include #include #include #include #include #define SEM_PATHNAME "." #define SEM_PRO_ID 103 #define SEM_CONTROL_P 1 #define SEM_CONTROL_C 0 union semun{ int val; unsigned short *array; }; int sem_create(int nsems,unsigned short values[]) { int semid,ret; key_t key; union semun s; key = ftok(SEM_PATHNAME,SEM_PRO_ID); // 创建 key if (key == -1){ perror("[ERROR] ftok() : "); return -1; } semid = semget(key,nsems,IPC_CREAT|0666); // 创建信号量集合 nsems:信号量个数 第三个参数为信号量集合权限 if (semid == -1){ perror("[ERROR] semget() : "); return -1; } s.array = values; ret = semctl(semid,0,SETALL,s); // 设置信号量的值 if (ret == -1){ perror("[ERROR] semctl() : "); return -1; } return semid; } /* 占用信号量资源 @param semid : 信号量集合的id @param semnum : 操作的信号量编号 */ int sem_p(int semid,int semnum) { struct sembuf sops; sops.sem_num = semnum; sops.sem_op = -1; sops.sem_flg = SEM_UNDO;// 进程终止,会自动释放 return semop(semid,&sops,1); } /* 释放信号量资源 @param semid : 信号量集合的id @param semnum : 操作的信号量编号 */ int sem_v(int semid,int semnum) { struct sembuf sops; sops.sem_num = semnum; sops.sem_op = 1; sops.sem_flg = SEM_UNDO; return semop(semid,&sops,1); } /* 删除信号量集合 @param semid : 信号量集合的id */ int sem_del(int semid) { return semctl(semid,0,IPC_RMID,NULL); } int main(int argc, const char *argv[]) { int semid; int nsems = 2; unsigned short values[] = {0,1}; int fd = open("./time.txt",O_WRONLY|O_CREAT,0666); semid = sem_create(nsems,values); if(semid == -1) { perror("creat fail!"); exit(1); } pid_t cpid = fork(); if(cpid == -1) { perror("[ERROR] fork():"); } else if(cpid == 0) { time_t t; struct tm *p_datetime; char timbuf[256] = {0}; while(1) { sem_p(semid,SEM_CONTROL_C); t = time(NULL); p_datetime = localtime(&t); sprintf(timbuf," %d-%d-%d %d::%d::%d\n" ,p_datetime->tm_year + 1900 ,p_datetime->tm_mon + 1 ,p_datetime->tm_mday ,p_datetime->tm_hour ,p_datetime->tm_min ,p_datetime->tm_sec ); write(fd,timbuf,sizeof(timbuf)); sem_v(semid,SEM_CONTROL_P); } } else if(cpid > 0) { int n = 0; char buf[20] = {0}; while(n < 10) { sem_p(semid,SEM_CONTROL_P); sprintf(buf,"%d,\n",3); sem_v(semid,SEM_CONTROL_P); } kill(cpid,SIGKILL); wait(NULL); exit(0); } return 0; }

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号