You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:18:03