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

标签 c++ fork

我有一个任务是从命令行获取一个字符串,将其反转并使用 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/

相关文章:

c++ - 计算着色器不会写入缓冲区

客户端与服务器通信,执行命令

c - 管道、子进程和子进程的范围

c - (waitpid((pid_t)-1, NULL, WNOHANG) 如何跟踪要返回的子进程?

c++ - Qt5.5 32bit 连接到 MySQL 数据库 - 受限用户帐户

c++ - 我应该如何使用remove_if删除两个数字范围内的元素

c++ - xstring 在 0x1005E5F6 (ucrtbased.dll) 抛出未处理的异常

c++ - C 和 C++ 之间的内存布局兼容性

python - 为什么调用守护进程时 Python check_output() 不返回?

mysql - Perl 模块实例化 + DBI + fork "Mysql server has gone away"