gpt4 book ai didi

c++ - 如何以正确的格式沿第二条管道发回数据?

转载 作者:太空宇宙 更新时间:2023-11-04 12:57:57 26 4
gpt4 key购买 nike

我已经努力了两天,试图修复我代码中的最后一个错误,但似乎找不到错误。代码应该(按顺序):

  1. 从用户(在本例中为我)接收字符串
  2. 创建子进程
  3. 将字符串发送给子进程
  4. 修改字符串,使每个单词都以大写字母开头
  5. 将更改后的字符串发送回父级
  6. 显示字符串

代码运行良好,直到父级读取。示例输出是:

输入:“你好”

家长写“hello tHerE”

child 读“helLO tHerE”

child 写“你好”

父级读取@#$%^$#%^&* - 或其他一些此类非标准字符,然后显示错误 -

双重释放或损坏(出):0x00007ffeeebb2690 ***

下面是我的代码:

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string>
#include <algorithm>

using namespace std;

int main(){
int fd[2];
int pfc[2];
int status = 0;
string val = "";

if(pipe(fd) == -1 || pipe(pfc) == -1) fprintf(stderr,"Pipe failed");

pid_t pid = fork();

// fork() returns 0 for child process, child-pid for parent process.
if (pid == 0){ // child: reading only, so close the write-descriptor
string writeval = "";
close(fd[1]);

// now read the data (will block)
read(fd[0], &val, sizeof(val));
cout << "Child reads " << val.c_str() << endl;
string temp = " " + val;
transform(temp.begin(), temp.end(), temp.begin(), ::tolower);
for(size_t i = 1; i < temp.length(); i++){
if(!isspace(temp[i]) && isspace(temp[i-1])){
temp[i] = toupper(temp[i]);
}
}
writeval = temp.substr(1, temp.length() - 1);

// close the read-descriptor
close(fd[0]);
close(pfc[0]);
cout << "Child writes " << writeval.c_str() << endl;

write(pfc[1], &writeval, sizeof(writeval));

close(pfc[1]);
exit(0);
}
else{
string readval = "";
string temp ="";
// parent: writing only, so close read-descriptor.
close(fd[0]);

// send the value on the write-descriptor.
while(getline(cin, temp)){
val += temp;
}
write(fd[1], &val, sizeof(val));

cout << "Parent writes " << val << endl;
// close the write descriptor
close(fd[1]);
//wait(&status);
close(pfc[1]);
read(pfc[0], &readval, sizeof(readval));
cout << "Parent reads " << readval << endl;
close(pfc[0]);

}
return 0;
}

最佳答案

所以答案很简单。在子进程中,我在写回父方法时将 writeval 的内存位置传递给父进程,但在父进程中,我试图从 readval 的内存位置读取。这是通过将它们更改为同一个变量来解决的,在 if/else 调用之外,就像对变量 val 所做的那样。

参见 here有关为什么这是一个问题的更多详细信息。

关于c++ - 如何以正确的格式沿第二条管道发回数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45666174/

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