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

作业社区

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

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

学无止境呀呀呀 的学生作业:

#include // 使用 EINTR 判断被信号打断 #include // 使用 printf、fgets、fdopen #include // 使用 EXIT_FAILURE/EXIT_SUCCESS #include // 使用 strlen、strcmp #include // 使用 pid_t 类型 #include // 使用 waitpid 等待子进程 #include // 使用 pipe、fork、write、close #define BUFFER_SIZE 1024 // 定义缓冲区大小,限制一次读写长度 static int write_all(int fd, const char *buf, size_t len) { // 保证写完全部数据 size_t off = 0; // 已写入的字节数 while (off < len) { // 还没写完就继续 ssize_t n = write(fd, buf + off, len - off); // 写剩余数据 if (n < 0) { // 写失败 if (errno == EINTR) { // 被信号中断 continue; // 重试写入 } return -1; // 其他错误直接返回失败 } off += (size_t)n; // 累加已写入字节 } return 0; // 全部写入成功 } int main(void) { int pipe_fd[2]; // 管道描述符:0 读端,1 写端 pid_t pid; // 保存 fork 返回的进程 ID char buffer[BUFFER_SIZE]; // 读写缓冲区 if (pipe(pipe_fd) == -1) { // 创建管道 perror("pipe"); // 打印错误原因 return EXIT_FAILURE; // 失败退出 } pid = fork(); // 创建子进程 if (pid < 0) { // fork 失败 perror("fork"); // 打印错误原因 return EXIT_FAILURE; // 失败退出 } if (pid == 0) { // 子进程分支 close(pipe_fd[1]); // 子进程关闭写端 FILE *in = fdopen(pipe_fd[0], "r"); // 将读端包装成 FILE* 便于 fgets if (!in) { // fdopen 失败 perror("fdopen"); // 打印错误原因 close(pipe_fd[0]); // 关闭读端避免泄漏 return EXIT_FAILURE; // 失败退出 } printf("[子进程] 等待数据...\n"); // 提示正在等待 while (fgets(buffer, sizeof buffer, in)) { // 按行读取管道内容 size_t len = strlen(buffer); // 计算行长度 if (len > 0 && buffer[len - 1] == '\n') { // 检查末尾换行 buffer[len - 1] = '\0'; // 去掉换行便于比较 } printf("[子进程] 收到数据: %s\n", buffer); // 打印收到内容 if (strcmp(buffer, "quit") == 0) { // 判断是否退出指令 printf("[子进程] 检测到 quit,准备退出。\n"); // 提示退出 break; // 退出读取循环 } } fclose(in); // 关闭流并同时关闭读端 printf("[子进程] 退出。\n"); // 子进程退出提示 return EXIT_SUCCESS; // 子进程正常退出 } close(pipe_fd[0]); // 父进程关闭读端 printf("[父进程] 请输入内容 (quit 退出):\n"); // 提示用户输入 while (fgets(buffer, sizeof buffer, stdin)) { // 从标准输入读取一行 size_t len = strlen(buffer); // 获取输入长度 int is_quit = (strcmp(buffer, "quit\n") == 0 || strcmp(buffer, "quit") == 0); // 判断是否为 quit if (write_all(pipe_fd[1], buffer, len) == -1) { // 写入管道 perror("write"); // 写入失败提示 break; // 停止循环 } if (is_quit) { // 如果是 quit printf("[父进程] 发送 quit,正在停止...\n"); // 提示退出 break; // 退出循环 } } close(pipe_fd[1]); // 关闭写端以发送 EOF waitpid(pid, NULL, 0); // 等待子进程结束 printf("[父进程] 退出。\n"); // 父进程退出提示 return EXIT_SUCCESS; // 父进程正常退出 }

微信客服

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

帮助反馈 APP下载

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

公众号

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