首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ubunu20.04的C++ 7.5和RockyLinux 8.4之间不同的RockyLinux叉()行为

Ubunu20.04的C++ 7.5和RockyLinux 8.4之间不同的RockyLinux叉()行为
EN

Stack Overflow用户
提问于 2022-05-06 20:08:45
回答 1查看 63关注 0票数 0

我正在处理一些遗留代码。它在CentOS 7系统上工作得很好。args阵列在Rocky 8.4和Ubuntu 20.04系统上都会被使用。我简化了问题并添加了打印语句。execv()正在启动另一个程序。去执政官的火箭筒都搞砸了。没有分叉,代码将按预期的方式工作。不知所措。

我有两个简单的测试程序,其中一个什么都不做。

test9.cpp

代码语言:javascript
运行
复制
int main(){}

和test10.cpp

代码语言:javascript
运行
复制
#include <iostream>
#include <string>
#include <vector>
#include <unistd.h>
int main()
{
   std::vector<std::string> stringArgs;
   std::string a{"./test9.x"};
   std::string b{"test10.cpp"};
   stringArgs.push_back(a);
   stringArgs.push_back(b);
        char* args[stringArgs.size()+1];
   if(fork() == 0){
        for(uint8_t i = 0; i < stringArgs.size(); i++) {
            std::string tmp(stringArgs[i]);
            args[i] = const_cast<char*>(tmp.c_str());
        std::cout << "\n\t"<<args[i]<<"'\n\n";
        }
        std::cout << "\n\t"<<args[0]<<"'\n\n";
        std::cout << "\n\t"<<args[1]<<"'\n\n";
        // last argument has to be NULL
        args[stringArgs.size()] = NULL;
    
        execv(args[0],&args[0]);
        std::cout << "\n\tERROR: Could not run '"<<args[0]<<"'\n\n";
   }
   else
    std::cout<<"parent\n";
}

g++ -o test9.x test9.cpp; g++ -o test10.x test10.cpp

在CentOS 7上我得到:

代码语言:javascript
运行
复制
$ ./test10.x

    ./test9.x


    test10.cpp


    ./test9.x


    test10.cpp

    parent

在Rocky Linux8.4和Ubuntu20.04上,我都知道这一点。注意,test9.x在for循环之后被test10.cpp替换。

代码语言:javascript
运行
复制
./test10.x
parent

    ./test9.x


    test10.cpp


    test10.cpp


    test10.cpp


    ERROR: Could not run test10.cpp
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-06 20:15:57

THis回路

代码语言:javascript
运行
复制
   for(uint8_t i = 0; i < stringArgs.size(); i++) {
        std::string tmp(stringArgs[i]);
        args[i] = const_cast<char*>(tmp.c_str());
        std::cout << "\n\t"<<args[i]<<"'\n\n";
    }

正在创建指向堆栈上的临时指针的数组,或定义了std::string部分的内部实现。

代之而行

代码语言:javascript
运行
复制
   for(uint8_t i = 0; i < stringArgs.size(); i++) {
        args[i] = strdup(stringArgs[i]);
        std::cout << "\n\t"<<args[i]<<"'\n\n";
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72146860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档