作业社区
探索学习新天地,共享知识资源!
weixin_慕哥3021856 的学生作业:
#include #include #include #include #include #include static int number = 0; static int total_produce_num = 0; static int total_consume_num = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *thread_handler(void *arg) { int cnt = atoi((char *)arg); int i = 0; for (i = 0; i < cnt; i++) { pthread_mutex_lock(&mutex); printf("线程 [%ld] 生产1个产品, 产品数量是 %d\n", pthread_self(), ++number); pthread_mutex_unlock(&mutex); usleep(1000); // 模拟生产耗时 } return NULL; } int main(int argc, const char *argv[]) { int i = 0, err = 0; if (argc < 2) { fprintf(stderr, "Usage: %s producer1_num producer2_num ...\n", argv[0]); exit(EXIT_FAILURE); } // 创建生产者线程 pthread_t producers[argc - 1]; for (i = 1; i < argc; i++) { // 获取生产数量的和 total_produce_num += atoi(argv[i]); err = pthread_create(&producers[i-1], NULL, thread_handler, (void *)argv[i]); if (err != 0) { perror("pthread_create()"); exit(EXIT_FAILURE); } } // 消费者 while (total_consume_num < total_produce_num) { pthread_mutex_lock(&mutex); if (number > 0) { printf("消费1个产品,产品数量是 %d\n", --number); total_consume_num++; } pthread_mutex_unlock(&mutex); usleep(1000); } for (i = 0; i < argc - 1; i++) { pthread_join(producers[i], NULL); } printf("生产总数: %d, 消费总数: %d\n", total_produce_num, total_consume_num); return 0; }
+77
weixin_慕哥3021856 的学生作业:
#include #include #include #include #include #define MAX_ARGS 20 // 最大参数数量 int main(void) { pid_t cpid; char order[256]; // 用户输入的内容 char *args[MAX_ARGS]; // 命令参数 char *token = NULL; // 用于分割字符串的临时指针 int status = 0; // 子进程的状态 while (1) { printf("minishell> "); fflush(stdout); if (fgets(order, sizeof(order), stdin) == NULL) { printf("\n"); break; } // 移除输入末尾的换行符 order[strcspn(order, "\n")] = '\0'; int i = 0; // 分割用户的输入为命令和参数 token = strtok(order, " "); while (token && i < MAX_ARGS - 1) { args[i++] = token; token = strtok(NULL, " \t"); } // 参数数组以NULL结尾 args[i] = NULL; // 跳过空输入(如回车) if (!args[0]) continue; // 内置命令exit if (strcmp(args[0], "exit") == 0) break; // 创建子进程来执行命令 cpid = fork(); if (cpid == -1) { perror("Failed to fork()"); continue; } else if (cpid == 0) { // 子进程执行命令 execvp(args[0], args); // 若execvp返回,表示执行失败 perror("Failed to execvp()"); exit(EXIT_FAILURE); } else { // 父进程等待子进程退出 waitpid(cpid, &status, 0); } } return 0; }
+95