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