gpt4 book ai didi

c++ - C++中使用管道实现父子进程通信

转载 作者:行者123 更新时间:2023-12-04 14:48:55 24 4
gpt4 key购买 nike

我想做这道题,但我不能接受输入信息:

创建一个执行以下操作的程序:

1.创建父子进程

2.父进程从键盘读取一个数字并发送给子进程

3. child 计算给定的数字是否为质数,并将结果打印在屏幕上

这是我的代码:

#include <iostream>
#include <unistd.h> // for fork()
#include <string.h> // for strerror()
#include <sys/wait.h>
#include <sys/types.h>

using namespace std;

bool isprime(int number);

int main()
{
int num;
pid_t pid;
int fd[2];
char buffer[100];
pipe(fd);

pid = fork();

//parent process
if (pid > 0)
{
cin>>num;
write(fd[1], &num, sizeof(num));
close(fd[1]);
int status;
//Do not check for errors here
wait(&status);
}
//child process
else if (pid == 0)
{
read(fd[0], buffer, 100);
close(fd[0]);
if (isprime(num))
{
cout<<"number is prime";
}
else
{
cout<<"number is not prime";
}
return EXIT_SUCCESS;
}

else
{
cout << "fork() failed (" << 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++)
{
// Take the rest of the division
if ((number % i) == 0)
return false;
}

return true;
}

this my result of run

最佳答案

将管道与 fork 一起使用并不难,但您必须遵守一些规则:

  • 每个部分应该关闭它不使用的句柄。不做是 future 问题的关键
  • 从fork开始,一个进程的变化不会反射(reflect)到另一个进程

你的代码应该变成:

...
//parent process
if (pid > 0)
{
close(fd[0]); // close the part that only the other process will use
cin>>num;
write(fd[1], &num, sizeof(num));
close(fd[1]);
int status;
//Do not check for errors here
wait(&status);
}
//child process
else if (pid == 0)
{
close(fd[1]); // close the part used by the other process
read(fd[0], &num, sizeof(num)); // read into num what the parent has written
close(fd[0]);
...

在现实世界的代码中,您应该检查每次读取是否成功(来自 cin 和来自管道...)

关于c++ - C++中使用管道实现父子进程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69407744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com