C++用管道实现父子进程通信时无法接收输入问题求助
错误原因
- 父子进程在
fork后地址空间相互独立,父进程读取的num值无法直接被子进程访问,子进程中直接使用的num是未初始化的随机值,判断逻辑完全无效 - 管道读取的内容存储在
buffer数组中,你没有将这部分内容转为整型用于素数判断,相当于完全没用到管道传递的有效数据 - 子进程的输出结尾没有换行符,标准输出默认行缓冲,没有换行的情况下内容会滞留在缓冲区不会打印到屏幕,会给你造成程序无法接收输入的错觉
- 读取管道时不需要读100字节,仅需读取和int类型大小相等的字节数即可,避免多余操作
修正后完整代码
#include <iostream> #include <unistd.h> // for fork() #include <string.h> // for strerror() #include <sys/wait.h> #include <sys/types.h> #include <errno.h> // 补充errno头文件 using namespace std; bool isprime(int number); int main() { int num; pid_t pid; int fd[2]; pipe(fd); pid = fork(); //父进程逻辑 if (pid > 0) { cin >> num; write(fd[1], &num, sizeof(num)); close(fd[1]); int status; wait(&status); } //子进程逻辑 else if (pid == 0) { int recv_num; // 直接读取int大小的数据到接收变量 read(fd[0], &recv_num, sizeof(recv_num)); close(fd[0]); if (isprime(recv_num)) { cout << "该数字是素数" << endl; } else { cout << "该数字不是素数" << endl; } return EXIT_SUCCESS; } else { cout << "fork()调用失败(" << strerror(errno) << ")" << endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } bool isprime(int number) { if (number < 2) return false; if (number == 2) return true; for (int i = 2; (i*i) <= number; i++) { if ((number % i) == 0) return false; } return true; }
内容的提问来源于stack exchange,提问作者Zuhriddin Musabayev
相关产品推荐
相关产品推荐

