
作业社区
探索学习新天地,共享知识资源!
向佐佐 的学生作业:
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 【图片】





Linkus 的学生作业:
linkus@windwaker:~/Desktop/C++/lesson8-cpconstructor$ g++ -fno-elide-constructors home.cpp ; ./a.out Test(int size) Test(const Test obj) Test(const Test obj) Test(const Test obj) ~Test() Test(const Test obj) ~Test() ~Test() ~Test() ~Test() 普通构造在 Test obj1(3); 拷贝构造 Test function(Test obj)传参 Test tmp = obj; 赋值 return tmp; 函数返回 Test obj2 = function(obj1); 赋值 析构在: 5. return tmp; 返回时释放tmp 6. Test obj2 = function(obj1) 传参的obj1 7. Test function(Test obj) { Test tmp = obj; return tmp; } 临时返回对象 8. return 0: 释放obj1 9. return 0 释放obj2 不知道对不对哈,大概分析了一下 Test(int size) Test obj1(3); Test(const Test obj) function(obj1) 的obj1 Test(const Test obj) Test tmp = obj; 的tmp Test(const Test obj) Test function(Test obj) 的返回值 ~Test() Test function(Test obj) 的obj Test(const Test obj) function(obj1) 这个值 ~Test() tmp ~Test() function(obj1) ~Test() obj1 ~Test() obj2 这里有个疑问就是这个参数在返回的时候,obj tmp 和返回值的释放顺序,希望老师能解答一下 #include #include using namespace std; class Test{ public: Test(int size):size(size){ cout





Linkus 的学生作业:
linkus@windwaker:~/Desktop/C++/lesson7-constructor$ g++ home.cpp ; ./a.out 1 2 3 4 5 6 7 8 9 10 #include using namespace std; class Test{ public: Test(int size){ data = new int[size]; } ~Test(){ if(data) delete [] data; } void insert(int data){ this->data[index ++] = data; } void show(void){ for(int i = 0;i < index;i ++){ cout show(); return 0; }





Linkus 的学生作业:
String constructor Character: H ASCII: 72 Character: e ASCII: 101 Character: l ASCII: 108 Character: l ASCII: 108 Character: o ASCII: 111 Character: , ASCII: 44 Character: w ASCII: 119 Character: o ASCII: 111 Character: r ASCII: 114 Character: l ASCII: 108 Character: d ASCII: 100 Character: ! ASCII: 33 #include #include using namespace std; class String { public: String(const char *str = NULL){ coutstr,str); } else { str = new char[1] {'\0'}; *this->str = '\0'; } } void show(void){ if(str){ for(int i=0;i




