首页 > 解决方案 > 如何通过命名管道 C++ 发送 int

问题描述

我似乎找不到通过命名管道发送 int 的任何解释,尽管我见过很多类似的事情。现在,该程序为 Collat​​z 猜想接受用户输入,但如果输入为 0,它就会像输入一样退出。父进程接收输入并将其发送给子进程。

#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int pid;
    int fd[2];
    int input;
    //create child
    pid = fork();

    if (pid > 0){
        //parent process
        wait(NULL);
        close(fd[0]);

        std::cout << "Enter an int value: ";
        std::cin >> input;
        
        write(fd[1], &input, sizeof(input));

        close(fd[1]);
    }

    else if (pid == 0){
        close(fd[1]);
        //child process
        read(fd[0], &input, sizeof(input));

        int workingNum = input;
        close(fd[0]);
        if (workingNum > 0){
            while (workingNum != 1){
                //even
                if(workingNum % 2 == 0){
                    workingNum = workingNum / 2;
                    std::cout << workingNum;
                    std::cout << " ";
                }
                else {
                    workingNum = 3 * workingNum + 1;
                    std::cout << workingNum;
                    std::cout << " ";
                }
            }
        } 
    }
    return 0;
}

标签: c++pipe

解决方案


两个错误:

  • 正如 jtbandes 指出的那样,您必须实际调用该pipe(2)函数来创建管道。pipe(fd)fork(). _ (g++ with-Wall -O会给你一个关于fd未初始化的警告。)

  • 您有一个典型的死锁:父调用wait(NULL),因此在子退出之前它不会继续写入管道。但是孩子正在尝试从管道中读取数据,并且在父母写完东西之前不会继续退出。所以这两个过程都卡住了。您可能希望将 移到wait(NULL)父代码的末尾。

在这些更改之后,它对我有用。但是,对所有系统调用进行错误检查会很好。


推荐阅读