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

作业社区

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

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

向佐佐 的学生作业:

main.c #include "sem.h" int main(void) { pid_t cpid; int semid; unsigned short values[] = {1,0};//信号量的值 semid = sem_create(2,values);//信号量集合中只创建2个信号量,信号量的值为1,0 int index = 1;//前面的序号 time_t seconds; struct tm *local_time;//中间的时间 char *str;//要写入文件的字符串 char *year; char *month; char *day; char *hour; char *min; char *sec; cpid = fork(); if(cpid == -1) { perror("[ERROR]fork():"); exit(EXIT_FAILURE); } else if(cpid == 0) { for(;;) { sem_p(semid,SEM_CONTROL_C); seconds = time(NULL); local_time = localtime(&seconds); year = num_to_str(local_time->tm_year+1900); month = num_to_str(local_time->tm_mon+1); day = num_to_str(local_time->tm_mday); hour = num_to_str(local_time->tm_hour); min = num_to_str(local_time->tm_min); sec = num_to_str(local_time->tm_sec); fputs(year,stdout); fputs("-",stdout); fputs(month,stdout); fputs("-",stdout); fputs(day,stdout); fputs(" ",stdout); fputs(hour,stdout); fputs(":",stdout); fputs(min,stdout); fputs(":",stdout); fputs(sec,stdout); fflush(stdout); sem_v(semid,SEM_CONTROL_P); free(year); free(month); free(day); free(hour); free(min); free(sec); } } else if(cpid > 0) { for(;;) { sem_p(semid,SEM_CONTROL_P);//p = 1,====>p = 0,阻塞 str = num_to_str(index); fputs(str,stdout); fputs(",\n",stdout); fflush(stdout); sem_v(semid,SEM_CONTROL_P); sleep(1); free(str); index++; } wait(NULL); } return 0; } sem.c #include "sem.h" /* *创建信号量集合 @param nsems : 信号量的个数 @param values : 信号量的值的数组 * */ int sem_create(int nsems,unsigned short values[]) { key_t key; int semid; union semun s; int ret; key = ftok(SEM_SET_PATHNAME,SEM_PRO_ID); if(key == -1) { perror("[ERROR]ftok():"); return -1; } semid = semget(key,nsems,IPC_CREAT|0644); 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); } 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); } int sem_del(int semid)//删除信号量集合 { return semctl(semid,0,IPC_RMID,NULL); } char *num_to_str(int num) { char *str; int size = snprintf(NULL,0,"%d",num)+1; str = (char *)malloc(size); snprintf(str,size,"%d",num); return str; } /* * char *time_to_stri_1(struct tm *local_time) { char *str; str = (char *)malloc(128); char *year = num_to_str(local_time->tm_year+1900); char *month = num_to_str(local_time->tm_month+1); char *day = num_to_str(local_time->tm_day); char *hour = num_to_str(local_time->tm_hour); char *min = num_to_str(local_time->tm_min); char *sec = num_to_str(local_time->sec); return str; } */ /* * void time_to_str(struct tm *local_time,char *str) { strftime(str,sizeof(str),"%Y-%m-%d %H:%M;%S",local_time); return; } */ sem.h #ifndef __SEM_H__ #define __SEM_H__ #include #include #include #include #include #include #include #include #include #define SEM_SET_PATHNAME "." #define SEM_PRO_ID 99 #define SEM_CONTROL_P 0//控制父进程的信号量编号 #define SEM_CONTROL_C 1//控制子进程的信号量编号 union semun { unsigned short *array; }; extern int sem_create(int nsems,unsigned short values[]);//创建信号量的集合 extern int sem_p(int semid,int semnum);//占用资源 extern int sem_v(int semid,int semnum);//释放资源 extern int sem_del(int semid);//删除信号量集合 extern char *num_to_str(int num);//将数字序号转化为字符串,字符串变量用完记得free //extern void time_to_str(struct tm *local_time,char *str);//时间转化为字符串 #endif Makefile all: @gcc main.c sem.c -o main 【图片】

微信客服

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

帮助反馈 APP下载

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

公众号

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