有没有一种方法可以让父进程可以使用子进程的计数,以便父进程可以打印它



我正在尝试使用子进程对字符串中的字符进行计数,然后将该计数提供给父进程,以便父进程可以将其打印出来。经过几个小时的视频和阅读,我仍然找不到一种方法,可以从子进程中获得一些东西给父进程。有人能举一个类似我所问的例子吗。

我认为帮助很重要(这让我修改…(

应该有很多SO帖子可以找到,比如How to get return value from CHILD PROCESS?。

  • 我(再次(发现您只能从进程的返回值中检索一个字节,这听起来很奇怪。毕竟,您只返回一个状态,256个值就足以表达某些内容
  • 返回值不用于检索大量信息

即使是像主函数返回值范围这样的插话提示,表明你可能会得到更多,在我这边也不成功。

  • 返回值为int。std::string的大小为Size_t
  • 讨厌的老师们很可能会用这样巨大的绳子来设置练习,比如说100009

因此,这个练习的一个更简单的方法是在父级和子级之间建立一个管道(桥(,重新定义标准输入和输出,顺便说一下,只使用cin和cout流。

#include <iostream>
#include <unistd.h>
enum { read_end = 0, write_end, PIPE_EDGE_NB};
int main(int argc, char* argv[])
{
int fd[PIPE_EDGE_NB];

std::string long_str(100009,'*');

int res = pipe(fd);
if (0>res) {
std::cout << "pipe failedn" << std::flush;
return -1;
}
pid_t pid = fork();
if (0>pid) {
std::cout << "fork failedn" << std::flush;
return -1;
}

switch(pid)
{
case 0: {//Child
auto sz = long_str.size();
std::cout << "Child says size is " << sz << "n" << std::flush;
dup2(fd[write_end],STDOUT_FILENO);
close(fd[write_end]);
std::cout << sz << "n" << std::flush;

}
break;

default:{
dup2(fd[read_end],STDIN_FILENO);
close(fd[read_end]);
size_t received_size;
try {
std::cin >> received_size;
}
catch(std::exception & ex) {
std::cout << ex.what() << "n" << std::flush;
return -1;
}
std::cout << "Parent says size is " << received_size << "n" << std::flush;
}
break;
}

return 0;
}

Child说尺寸是100009

父级表示大小为100009

最新更新