我们已经用 golang 和 ac wrapper 编写了一些函数来调用这些函数。我们首先构建 golang 代码来创建一个存档文件,然后我们在 c 中构建包装器代码以作为 DLL 使用。


在我的程序中使用 LoadLibraryA(path_to_dll) 加载此 DLL 后,我看到 fd 0、1 和 2 的继承标志从 1 更改为 0。但这不会在加载 DLL 后立即发生。我在加载库调用后在我的代码中添加了睡眠,似乎在加载库后需要几毫秒才能更改标志值。


我正在使用 GetHandleInformation((HANDLE) sock, &flags) 来获取继承标志值。


关于可能导致此问题的任何想法/指示?谢谢!


更新: 我能够在 go 代码中找到翻转继承标志值的确切行。以下 k8sService.go 代码中的全局变量 reqHandler 导致了此问题。知道为什么使用这个全局变量会翻转继承标志值吗?


my-lib/k8sService.go(go代码)


package main


import "C"

import (

    "my-lib/pkg/cmd"

)


func main() {

}


var reqHandler []*cmd.K8sRequest

我的库/pkg/cmd/execute.go


import (

    "my-lib/pkg/dto"

)


type K8sRequest struct {

    K8sDetails dto.K8sDetails

}

my-lib/pkg/dto/structs.go


package dto


// K8sDetails contains all the necessary information about talking to the cluster. Below struct has few more variables.

type K8sDetails struct {

    // HostName of the cluster's API server

    HostName string `json:"hostname"`

    // Port on which the API server listens on to

    Port int `json:"port"`

}

我们在上面的 k8sService.go 之上有一个 C 包装器。我们首先构建 golang 代码来创建一个存档文件,然后使用这个存档文件和 C 中的包装器代码构建目标 DLL。下面是加载此 DLL 并在加载 DLL 前后打印继承标志值的示例程序。


#include <windows.h>

#include <iostream>

#include <io.h>

#include "wrapper/cWrapper.h"


void printInheritVals() {

        typedef SOCKET  my_socket_t;

        my_socket_t fd0 = _get_osfhandle(0);

        my_socket_t fd1 = _get_osfhandle(1);

        my_socket_t fd2 = _get_osfhandle(2);

        std::cout << "fd0: " << fd0 << std::endl;

        std::cout << "fd1: " << fd1 << std::endl;

        std::cout << "fd2: " << fd2 << std::endl;

        

        

        DWORD flags;

        int inherit_flag_0 = -1;

        int inherit_flag_1 = -1;

        int inherit_flag_2 = -1;