C++ 写入和读取方法停止我的执行-管道c++;

C++ 写入和读取方法停止我的执行-管道c++;,c++,stdout,stdin,C++,Stdout,Stdin,我只是想做一棵“树”,在那里我有一个Ctsis和(目前)n个“孩子”通过管道连接到Ctsis;但当我尝试使用stdin和stdout通过管道将数据从孩子传递到家长,从家长传递到孩子时,会发生一些情况,特别是当我使用write()cpp函数时 //ctrsis.cpp int main(void) { vector<WriteIn> TubesReference; WriteIn mainTube; TubesReference.push_back(mainTube);

我只是想做一棵“树”,在那里我有一个Ctsis和(目前)n个“孩子”通过管道连接到Ctsis;但当我尝试使用stdin和stdout通过管道将数据从孩子传递到家长,从家长传递到孩子时,会发生一些情况,特别是当我使用write()cpp函数时

//ctrsis.cpp

int
main(void) {
  vector<WriteIn> TubesReference; 
  WriteIn mainTube;
  TubesReference.push_back(mainTube);
  const char* file = "ctrsis.cfg";
  int levelOneProcesses = 0;
  string line;
  ifstream configFile(file);
  if(configFile.is_open()){
    while ( getline (configFile,line) ){
      WriteIn structure = createTube(line);
      TubesReference.push_back(structure);
      levelOneProcesses++;  
    }
  }else{
    cout << "Unable to open file" << endl; 
  } 
  configFile.close();

  if ((TubesReference[0].in = open("ctrsis.cfg", O_RDONLY)) == -1) {
    std::cerr << "Error open file" << std::endl;
    return 1;
  }
  TubesReference[0].out = TubesReference[1].pipeOut[1];
  for (int i = 1; i < levelOneProcesses; ++i){
    TubesReference[i].in = TubesReference[i].pipeIn[0];
    if(i != TubesReference.size()-1){
      TubesReference[i].out = TubesReference[i+1].pipeOut[1];
    }else{
      TubesReference[TubesReference.size()-1].out = 1;
    }

  }

  pthread_t levelOneThreads[levelOneProcesses];  
  for(int i = 0; i < levelOneProcesses; ++i){
    vector<string> vec;
    istringstream iss(TubesReference[i+1].line);
    copy(istream_iterator<string>(iss),
    istream_iterator<string>(),
    back_inserter(vec));
    string file = "FICHEROCFG=" + vec[4];
    string folder = "DIRDETRABAJO=" + vec[3];
    char* formatFile = new char[file.length()+1]; 
    memcpy(formatFile, file.c_str(), file.length()+1);
    char* formatFolder= new char[folder.length()+1]; 
    memcpy(formatFolder, folder.c_str(), folder.length()+1);
    putenv(formatFile);
    putenv(formatFolder);
    cout << "CTRSIS: CREATE THREAD " << i << endl;
    int ret =  pthread_create(&levelOneThreads[i],NULL, readWriteThread, &TubesReference[i]);
    if(ret != 0) {
      cerr << "Error: pthread_create() failed\n" << endl;
      exit(EXIT_FAILURE);
    }else{
       cout << "CTRSIS: JOIN THREAD " << i << endl;
       pthread_join(levelOneThreads[i], NULL);
    }
  }
  //system( "./ctreval" );
  return 0;
}

void* readWriteThread(void *arg) {
  sleep(3);
  WriteIn *dataInOut = (struct WriteIn *) arg;
  cout << "CTRSIS: METHOD" << endl;
  char c;
  while (read(dataInOut->in, &c, 1) > 0) {
    write(dataInOut->out, &c, 1);
  }
  close(dataInOut->in);
  close(dataInOut->out);
  return NULL; 
}
//ctrsis.cpp
int
主(空){
向量管引用;
写入主管;
管参考。推回(主管);
const char*file=“ctrsis.cfg”;
int-leveloneprocesss=0;
弦线;
ifstream配置文件(file);
if(configFile.is_open()){
while(getline(configFile,line)){
WriteIn结构=createTube(行);
管参考。推回(结构);
leveloneprocesss++;
}
}否则{

不能像在块中永远停止或像在程序崩溃中停止?问题需要一些工作。什么是ctrsis?什么是WriteIn?为什么有两个主要函数?评估器用于什么?什么是“发生的事情”?你想做什么?发生了什么事?你想得到什么帮助?Ctrsis是读取一个文件,根据文件中的行数,我必须创建该数量的子进程(例如:2行,2个子进程),子进程使用标准输入中的不同信息执行evaluator,该输入是ctrsis的输出(管道来自此处)。每个evaluator线程处理相应的输入,并使用另一个管道再次将新数据发送到ctrsis。
#include <iostream>
#include <cctype>

int
main(void) {
 int c;

 while ((c = std::cin.get()) != EOF) {
    c = ::toupper(c);
    std::cout << (char) c;
 }

 return 0;
}