c++ - 如何通过命名管道 C++ 发送 int
问题描述
我似乎找不到通过命名管道发送 int 的任何解释,尽管我见过很多类似的事情。现在,该程序为 Collatz 猜想接受用户输入,但如果输入为 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;
}
解决方案
两个错误:
正如 jtbandes 指出的那样,您必须实际调用该
pipe(2)
函数来创建管道。pipe(fd)
在fork()
. _ (g++ with-Wall -O
会给你一个关于fd
未初始化的警告。)您有一个典型的死锁:父调用
wait(NULL)
,因此在子退出之前它不会继续写入管道。但是孩子正在尝试从管道中读取数据,并且在父母写完东西之前不会继续退出。所以这两个过程都卡住了。您可能希望将 移到wait(NULL)
父代码的末尾。
在这些更改之后,它对我有用。但是,对所有系统调用进行错误检查会很好。
推荐阅读
- python - 使用python访问web数据
- javascript - 如何使用 localStorage 在本地存储 jQuery 对象?
- r - 在 R 中解析文本以进行分析
- python - 找不到文件 Python
- python - 将包含化学名称的熊猫标题字符串转换为化学符号
- ios - creating a new image in a collection view based off of user input
- python - 碰撞问题平台游戏如何修复?
- jodit - Jodit:粘贴调用html粘贴弹出的文本失败
- java - 是否有用于用户输入的 Java 格式化库?
- python-3.x - Scrapy:点击链接以抓取每个项目的附加信息