gpt4 book ai didi

c++ - 使用 fork() 为每个 child 输出 1 个数组元素,C++

转载 作者:行者123 更新时间:2023-11-30 04:26:41 25 4
gpt4 key购买 nike

我有一个任务是从命令行获取一个字符串,将其反转并使用 fork() 在单独的子进程中输出每个字符。我只是没有从 fork() 调用中得到正确的输出。问题是索引在输出中变得困惑,比如 3、1、2、0,而它应该只是 3、2、1、0 ......等等......更令人困惑的是它随机成功时word 的长度为 3 个字符(但并非总是如此),但对于 4 个以上字符的单词通常是不正确的。循环在没有 fork() 调用的情况下正常工作。

这是我的主要功能,问题存在于for循环中。

int main(int argc, char **argv){
pid_t childpid = 0;
int i;
char* invert = new char[strlen(argv[1])+1];
int invert_length = strlen(argv[1]);
strcpy(invert, argv[1]);
for(i=invert_length-1; i>=0; i--){
childpid = fork();
if(childpid==(pid_t) 0){
//I am the child
cout<<"Child ["<< i <<"] = " << invert[i] <<"."<<endl;
break;
}
}
return 0;
}

最佳答案

对您的程序进行简单修改即可使其正常运行。让 child 做下一个 fork 。每个进程都等待它生成的进程。

int main(int argc, char **argv){
pid_t childpid = 0;
int i;
char* invert = new char[strlen(argv[1])+1];
int invert_length = strlen(argv[1]);
strcpy(invert, argv[1]);
for(i=invert_length-1; i>=0; i--){
childpid = fork();
if(childpid==(pid_t) 0){
//I am the child
cout<<"Child ["<< i <<"] = " << invert[i] <<"."<<endl;
continue;
}
break;
}
wait(0);
return 0;
}

编辑:Skizz 反对每个进程在启动下一个进程之前执行其工作。问题中没有要求首先启动所有进程,但下面的版本做到了这一点。

int main(int argc, char **argv){
pid_t childpid = 0;
int i;
char* invert = new char[strlen(argv[1])+1];
int invert_length = strlen(argv[1]);
strcpy(invert, argv[1]);
for(i=0; i<invert_length; ++i){
childpid = fork();
if(childpid!=(pid_t) 0){
wait(0);
break;
}
}
if (i-->0) cout<<"Child ["<< i <<"] = " << invert[i] <<"." <<endl;
return 0;
}

关于c++ - 使用 fork() 为每个 child 输出 1 个数组元素,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11430736/

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