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

作业社区

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

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

大禹123 的学生作业:

sem.h #ifndef __SEM_H__ #define __SEM_H__ #include #include #include #include #include #include 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); #endif sem.c #include "sem.h" /* 创建信号量的集合 @param nsems : 信号量的个数 @param values : 信号量的值的数组 */ #define SEM_PATH_NAME "." #define PROJ_ID 125 typedef union semun { unsigned short *array; //SETALL }semun_u; int sem_create(int nsems, unsigned short values[]) { key_t key; int semid, ret; semun_u s; key = ftok(SEM_PATH_NAME, PROJ_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; //-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; //1 表示释放资源 sops.sem_flg = SEM_UNDO; //进程终止,自动释放信号量 return semop(semid, &sops, 1); } //删除信号量 int sem_del(int semid) { return semctl(semid,0, IPC_RMID, NULL); } main.c #include #include #include #include #include #include #include "sem.h" #define SEM_CONTROL_C 0 #define SEM_CONTROL_P 1 int main(void) { pid_t cpid; int semid; unsigned short values[2] = {0, 1}; //表示信号量只有两个 int index = 1; semid = sem_create(2, values); if(semid == -1) { exit(EXIT_FAILURE); } cpid = fork(); if (cpid == -1){ perror("[ERROR] fork(): "); exit(EXIT_FAILURE); }else if (cpid == 0){ time_t t; struct tm *lc = NULL; while(1){ sem_p(semid, SEM_CONTROL_C); time(&t); lc = localtime(&t); int year = lc->tm_year + 1900; int month = lc->tm_mon + 1; int day = lc->tm_mday; int hours = lc->tm_hour; int min = lc->tm_min; int sec = lc->tm_sec; printf("%d-%d-%d %d:%d:%d",year,month,day,hours,min,sec); fflush(stdout); sem_v(semid, SEM_CONTROL_P); } }else if (cpid > 0){ while(1){ sem_p(semid, SEM_CONTROL_P); printf("%d,\n"); fflush(stdout); sem_v(semid, SEM_CONTROL_P); sleep(1); } wait(NULL); sem_del(semid); } } Makefile main: sem.c main.c gcc $^ -o main 结果【图片】

得分 100
学习任务

大禹123 的学生作业:

#include #include #include #include #include #include #include #include #include #define SHM_PATHNAME "." #define SHM_PRO_ID 102 #define SHM_SIZE 256 typedef struct { char mtext[128]; bool isread; bool iscomplete; int rbytes; }buffer_t; void *get_share_addr() { key_t key; int shmid; void *addr = NULL; //保存映射之后的起始地址 key = ftok(SHM_PATHNAME, SHM_PRO_ID); if(key == -1) { perror("[ERROR] ftok():"); exit(EXIT_FAILURE); } //创建共享内存 shmid = shmget(key, sizeof(buffer_t), IPC_CREAT|0666 ); if(shmid == -1) { perror("[ERROR] shmget():"); exit(EXIT_FAILURE); } addr = shmat(shmid, NULL, 0); if(addr == (void *)-1) { perror("[ERROR] shmat():"); exit(EXIT_FAILURE); } return addr; } int main(int argc, char *argv[]) { pid_t cpid; if(argc!=3) { fprintf(stderr, "Usage: %s ", argv[0]); exit(EXIT_FAILURE); } cpid = fork(); if(cpid == -1) { perror("[ERROR]: fork()"); exit(EXIT_FAILURE); } else if(cpid==0) { FILE *fp_desk = NULL; fp_desk = fopen(argv[2], "w+"); int witems; void *shm_addr = get_share_addr(); buffer_t buffer_info; if(NULL == fp_desk) { fclose(fp_desk); perror("Error fopen():"); exit(EXIT_FAILURE); } while(1) { memcpy(&buffer_info, shm_addr, sizeof(buffer_info)); if(buffer_info.iscomplete) break; //已经完成且读完了,就退出 if(!buffer_info.isread) { witems = fwrite(buffer_info.mtext, sizeof(buffer_info.mtext[0]), buffer_info.rbytes, fp_desk); buffer_info.isread = true; memcpy(shm_addr, &buffer_info, sizeof(buffer_info)); if(witems!= buffer_info.rbytes) { perror("[ERROR] fread():"); break; } } } fclose(fp_desk); shmdt(shm_addr); exit(EXIT_SUCCESS); } else if(cpid > 0) { FILE *fp_src = NULL; fp_src = fopen(argv[1], "r"); int ritems = 0; buffer_t buffer_info; void *shm_addr = get_share_addr(); if(NULL == fp_src) { perror("Error fopen():"); fclose(fp_src); exit(EXIT_FAILURE); } buffer_info.isread = true; buffer_info.iscomplete = false; memcpy(shm_addr, &buffer_info, sizeof(buffer_info)); while(1) { memcpy(&buffer_info, shm_addr, sizeof(buffer_info)); if(buffer_info.isread) { ritems = fread(buffer_info.mtext, sizeof(buffer_info.mtext[0]), 128, fp_src); buffer_info.isread = false; buffer_info.rbytes = ritems; buffer_info.iscomplete = ritems == 0 ? true : false; memcpy(shm_addr, &buffer_info, sizeof(buffer_info)); if(ritems == 0) { break; } } } fclose(fp_src); shmdt(shm_addr); wait(NULL); exit(EXIT_SUCCESS); } return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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