
作业社区
探索学习新天地,共享知识资源!
沫颖 的学生作业:
代码 sem.h #ifndef __SEM_H__ #define __SEM_H__ #include #include #include #include #include #include #include #include #include #define SEM_PATH_NAME "." #define SEM_PRO_ID 20 //主进程信号量索引 #define SEM_CONTROL_PARENT 0 //子进程信号量索引 #define SEM_CONTROL_CHILD 1 //创建信号量集合 /* * param index_sem:信号量集合的索引 * param init_values:信号量集合的初始值 * return:成功返回信号量集合的id,失败返回-1 * */ extern int sem_create(int index_sem,unsigned short init_values[]); //占用信号量资源 extern int sem_occupy(int sem_id,int num_sem); //释放信号量资源 extern int sem_free(int sem_id,int num_sem); //删除信号量集合 extern int sem_del(int sem_id); //获取当前时间,返回 yyyy-MM-dd HH:mm:ss 格式的字符串 extern void get_current_time(char *buffer, size_t buffer_size); #endif sem.c #include "sem.h" union semun { int val; unsigned short *array; }; //创建信号量集合 /* * param num_sem:信号量集合的总数 * param init_values:信号量集合的初始值(每个信号量中资源对应的初始值) * return:成功返回信号量集合的id,失败返回-1 * */ int sem_create(int num_sem,unsigned short init_values[]) { //生成唯一key int key_value = ftok(SEM_PATH_NAME,SEM_PRO_ID); if(key_value == -1){ perror("[ERROR]:ftok():]"); return -1; } //创建信号量集合 int sem_id = semget(key_value,num_sem,IPC_CREAT | 0666); if(sem_id == -1){ perror("[ERROR]:semget():]"); return -1; } //初始化信号量集合 union semun sem_union; sem_union.val = 1; sem_union.array = init_values; int ret = semctl(sem_id,0,SETALL,sem_union); if(ret == -1){ perror("[ERROR]:semctl():]"); return -1; } return sem_id; } //占用信号量资源 /* * param sem_id:信号量集合的id * param num_sem:要操作的信号量的索引编号 * */ int sem_occupy(int sem_id,int num_sem) { struct sembuf sem_op; sem_op.sem_num = num_sem; sem_op.sem_op = -1; sem_op.sem_flg = SEM_UNDO; // 进程终止,系统自动释放信号量资源 return semop(sem_id,&sem_op,1); } //释放信号量资源 /* * param sem_id:信号量集合的id * param num_sem:要操作的信号量的索引编号 * */ int sem_free(int sem_id,int num_sem) { struct sembuf sem_op; sem_op.sem_num = num_sem; sem_op.sem_op = 1; sem_op.sem_flg = SEM_UNDO; // 进程终止,系统自动释放信号量资源 return semop(sem_id,&sem_op,1); } //删除信号量集合 int sem_del(int sem_id) { return semctl(sem_id,0,IPC_RMID,NULL); } //获取当前时间,返回 yyyy-MM-dd HH:mm:ss 格式的字符串 void get_current_time(char *buffer, size_t buffer_size) { // 获取当前时间 time_t rawtime; struct tm * timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); // 格式化输出时间 strftime(buffer, buffer_size, "%Y-%m-%d %H:%M:%S", timeinfo); } main.c /* * 1-5 信号量的同步-课后练习 练习 创建一个子进程,将当前系统时间按照 1, 格式写入到文件中,具体要求如下: 1.由父进程写入1,< ,这里是序号,需要不断增加 2.由子进程写入当前时间 3.由父进程写入 >\n 4.至少循环10次 * */ #include "sem.h" int main(int argc, const char * argv[]) { pid_t pid; // 序号 int num = 1; // 创建信号量集合 int semid; unsigned short values[] = {1,0}; semid = sem_create(2,values); if (semid == -1) { perror("[ERROR]:sem_create()"); return -1; } // 创建子进程 pid = fork(); if(pid == -1) { perror("[ERROR]:fork()"); exit(EXIT_FAILURE); } else if(pid == 0){ while(1){ // 占用子进程资源 sem_occupy(semid,SEM_CONTROL_CHILD); // 2.由子进程写入当前时间 char curr_time[80]; get_current_time(curr_time,sizeof(curr_time)); printf("%s",curr_time); // 刷新缓冲区 fflush(stdout); // 释放主进程资源 sem_free(semid,SEM_CONTROL_PARENT); } }else if (pid > 0){ while(num\n printf(">\n"); // 刷新缓冲区 fflush(stdout); // 释放主进程资源 sem_free(semid,SEM_CONTROL_PARENT); sleep(1); } // 给子进程发送终止信号 kill(pid,SIGKILL); // 等待子进程结束 wait(NULL); // 删除信号量集合 sem_del(semid); } return 0; } 执行结果 felix@felixlinux:~/Desktop/Study/CProjects/imooc-embedded/Stage05/Week12/Class05/demo_5_5$ ./sem.out 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,





水蛭_312 的学生作业:
#ifndef _PLAYER_H #define _PLAYER_H #include using namespace std; class Player { public: Player(const string& name, const string& color):name(name),color(color) {} string getName(void) const { return name; } string getColor(void) const { return color; } virtual void placeChess(int x, int y) = 0; private: string name; string color; }; #endif ---------------------- #define _CRT_SECURE_NO_WARNINGS #ifndef _WHITE_PLAYER_H #define _WHITE_PLAYER_H #include "Player.hpp" #include "ChessBoard.hpp" #include "WhiteChess.hpp" class WhitePlayer :public Player { public: WhitePlayer(const string& name) :Player(name, "white") {} public: void placeChess(int x, int y) { ChessBoard* chessBoard = ChessBoard::getChessBoard(); bool ok = chessBoard->isValidPosition(x,y); if (ok) { chessBoard->placeChess(new WhiteChess(x,y)); } } }; #endif ---------------------- #define _CRT_SECURE_NO_WARNINGS #ifndef _BLACK_PLAYER_H #define _BLACK_PLAYER_H #include "Player.hpp" #include "ChessBoard.hpp" #include "BlackChess.hpp" class BlackPlayer :public Player { public: BlackPlayer(const string& name) :Player(name, "black") {} public: void placeChess(int x, int y) { ChessBoard* chessBoard = ChessBoard::getChessBoard(); bool ok = chessBoard->isValidPosition(x, y); if (ok) { chessBoard->placeChess(new BlackChess(x, y)); } } }; #endif ---------------------- #include "BlackPlayer.hpp" #include "WhitePlayer.hpp" #include "ChessBoard.hpp" #include int main(void) { // 在代码中直接设置使用UTF8代码页显示 SetConsoleOutputCP(65001); // 获取棋盘对象 ChessBoard* board = ChessBoard::getChessBoard(); board->show(); BlackPlayer blackPlayer("tiechui"); WhitePlayer whitePlayer("cuihua"); blackPlayer.placeChess(5,1); whitePlayer.placeChess(5,3); }





水蛭_312 的学生作业:
#include "BlackChess.hpp" #include "WhiteChess.hpp" int main(void) { BlackChess blackChess(10,5); blackChess.show(); WhiteChess whiteChess(5, 20); whiteChess.show(); fprintf(stderr, "\n"); } chess.hpp ------- #ifndef _CHESS_H #define _CHESS_H #include using namespace std; class Chess { public: Chess(const string& color, int x,int y):color(color),x(x),y(y) { } int getX(void) const { return x; } int getY(void) const { return y; } string getColor(void) const { return color; } virtual void show(void) const = 0; private: int x; int y; string color; }; #endif BlackChess.hpp----------- #ifndef _BLACK_CHESS_H #define _BLACK_CHESS_H #include "chess.hpp" class BlackChess :public Chess { public: BlackChess(int x, int y) :Chess("black", x, y) {} void show() const { fprintf(stderr, "\033[%d;%dH\033[43;35m[B]\033[0m", getY(),getX()-1); fprintf(stderr, "\033[%d;%dH", getY(),getX()); } }; #endif WhiteChess.hpp---------------------- #ifndef _WHITE_CHESS_H #define _WHITE_CHESS_H #include "chess.hpp" class WhiteChess :public Chess { public: WhiteChess(int x, int y) :Chess("white", x, y) {} void show() const { fprintf(stderr, "\033[%d;%dH\033[44;36m[W]\033[0m", getY(), getX() - 1); fprintf(stderr, "\033[%d;%dH", getY(), getX()); // 最终需要指定 光标的位置 } }; #endif




