
作业社区
探索学习新天地,共享知识资源!
浪潮君 的学生作业:
#include // 提供 printf 等输出函数 #include // 提供 exit 等退出控制函数 #include // 提供 POSIX 线程相关函数和类型 #include // 提供 sleep 等 UNIX 系统调用(本例中未使用) // 子线程执行的函数 void *thread_func(void *) { // 获取当前线程的线程 ID pthread_t tid = pthread_self(); // 打印当前线程的 ID(转换为 unsigned long 便于可读性) printf("子线程 ID: %lu\n", (unsigned long) tid); // 返回 NULL 表示线程正常退出(也可以返回其他值给 pthread_join 获取) return NULL; } int main() { // 声明两个线程变量,类型为 pthread_t(用于保存线程 ID) pthread_t tid1, tid2; // 创建第一个线程,让它执行 thread_func 函数 if (pthread_create(&tid1, NULL, thread_func, NULL) != 0) { perror("创建线程 1 失败"); // 如果创建失败,打印错误信息 exit(EXIT_FAILURE); // 程序异常退出 } // 创建第二个线程,也执行同一个函数 if (pthread_create(&tid2, NULL, thread_func, NULL) != 0) { perror("创建线程 2 失败"); exit(EXIT_FAILURE); } // 主线程等待第一个子线程结束(阻塞等待) pthread_join(tid1, NULL); // 主线程等待第二个子线程结束 pthread_join(tid2, NULL); // 两个子线程都结束后,主线程打印退出信息 printf("主线程结束。\n"); return 0; }
浪潮君 的学生作业:
#include // 标准输入输出头文件(用于 printf、fgets 等) #include // 标准库头文件(用于 exit、EXIT_FAILURE 等) #include // 字符串操作函数(如 strcmp, strtok) #include // Unix 系统调用头文件(如 fork, execvp) #include // 等待子进程结束(wait 函数) #define MAX_CMD_LEN 128 // 用户输入命令最大长度 #define MAX_ARGS 10 // 命令最多支持的参数个数(包含命令本身) int main(void) { char input[MAX_CMD_LEN]; // 用于保存用户输入的命令行 // 主循环:持续运行 shell,直到用户输入 "exit" while (1) { // 打印 shell 提示符 printf("minishell> "); fflush(stdout); // 确保提示符立即显示(防止缓冲延迟) // 读取用户输入(阻塞等待,最大读取 MAX_CMD_LEN 字节) if (fgets(input, sizeof(input), stdin) == NULL) { // 若读取失败或遇到 EOF(如 Ctrl+D),退出循环 break; } // 去除结尾的换行符(fgets 会保留 \n) input[strcspn(input, "\n")] = '\0'; // 判断是否是退出命令 if (strcmp(input, "exit") == 0) { break; } // -------- 命令解析 -------- // 使用 strtok 将输入字符串按空格分割为多个参数 char *args[MAX_ARGS] = {0}; // 参数数组初始化为 NULL int arg_count = 0; // 参数计数器 // 提取第一个 token(命令本身) char *token = strtok(input, " "); while (token != NULL && arg_count < MAX_ARGS - 1) { args[arg_count++] = token; // 将参数保存到数组 token = strtok(NULL, " "); // 提取下一个参数 } args[arg_count] = NULL; // 参数列表末尾设置为 NULL,符合 execvp 要求 // -------- 创建子进程 -------- pid_t pid = fork(); // 创建子进程 if (pid < 0) { // 创建失败,打印错误信息 perror("fork failed"); continue; // 回到循环继续处理下一个输入 } if (pid == 0) { // -------- 子进程 -------- // 使用 execvp 执行命令(搜索 PATH 环境变量) execvp(args[0], args); // 若 execvp 执行失败,则继续执行下面代码 perror("exec failed"); exit(EXIT_FAILURE); // 子进程异常退出 } else { // -------- 父进程 -------- // 等待子进程结束,防止出现僵尸进程 wait(NULL); } } // Shell 主循环结束,打印退出信息 printf("退出 minishell。\n"); return 0; }





浪潮君 的学生作业:
#include #include #include #include int main(void) { pid_t pid_a, pid_b; int status_a = 0, status_b = 0; int a_done = 0, b_done = 0; // 创建子进程 A pid_a = fork(); if (pid_a == 0) { // 子进程 A printf("[A] PID=%d 正在运行...\n", getpid()); sleep(2); printf("[A] PID=%d 退出\n", getpid()); exit(10); // 自定义退出码 } // 创建子进程 B pid_b = fork(); if (pid_b == 0) { // 子进程 B printf("[B] PID=%d 正在运行...\n", getpid()); sleep(5); printf("[B] PID=%d 退出\n", getpid()); exit(20); // 自定义退出码 } // 父进程非阻塞轮询两个子进程状态 while (!a_done || !b_done) { if (!a_done) { pid_t ret = waitpid(pid_a, &status_a, WNOHANG); if (ret == pid_a) { printf("[父进程] 检测到子进程 A (PID=%d) 已退出,状态码=%d\n", pid_a, WEXITSTATUS(status_a)); a_done = 1; } } if (!b_done) { pid_t ret = waitpid(pid_b, &status_b, WNOHANG); if (ret == pid_b) { printf("[父进程] 检测到子进程 B (PID=%d) 已退出,状态码=%d\n", pid_b, WEXITSTATUS(status_b)); b_done = 1; } } // 模拟父进程做其他事情 printf("[父进程] 正在工作...\n"); sleep(1); } printf("[父进程] 所有子进程已退出,程序结束。\n"); return 0; }





北城半夏4806197 的学生作业:
#include using namespace std; class mytime { private: int hour; int min; int sec; public: void setHour(const int _hour); void setMin(const int _min); void setSec(const int _sec); void output(); }; void mytime::setHour(const int _hour) { hour = _hour; return; } void mytime::setMin(const int _min) { min = _min; } void mytime::setSec(const int _sec) { sec = _sec; } void mytime::output() { cout





北城半夏4806197 的学生作业:
06so.c #include #include"06so.h" char *cpy(char *a,char *b) { char *copy = b; while(*a !='\0') { *(b++) = *(a++); } *b = '\0'; return copy; } char *cat(char *a,char *b) { char *coat = a; while(*a != '\0') { a++; } while(*b !='\0') { *(a++) = *(b++); } *a = '\0'; return coat; } 06so.h #ifndef __06SO_H_ #define __06SO_H_ #ifdef __cplusplus extern "C"{ #endif extern char *cpy(char *a,char *b); extern char *cat(char *a,char *b); #ifdef __cplusplus } #endif #endif main.cpp #include"06so.h" #include using namespace std; int main(int argc, const char *argv[]) { char a[] = "hello"; char b[] = {0}; cout




