亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 LoadLibraryA(path_to_dll) 加載 DLL 會將文件描述符

使用 LoadLibraryA(path_to_dll) 加載 DLL 會將文件描述符

Go
慕少森 2022-12-05 16:24:39
我們已經用 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 mainimport "C"import (    "my-lib/pkg/cmd")func main() {}var reqHandler []*cmd.K8sRequest我的庫/pkg/cmd/execute.goimport (    "my-lib/pkg/dto")type K8sRequest struct {    K8sDetails dto.K8sDetails}my-lib/pkg/dto/structs.gopackage 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;
查看完整描述

1 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

這是golang.org/x/sys/windows包中的錯誤。同樣的問題過去也存在于內置的 syscall 包中,但它在 Go 1.17 中得到了修復。

您項目中的某些內容必須導入包的 golang.org/x 版本而不是內置版本,因此執行以下代碼來初始化Stdin、StdoutStderr變量:

var (

    Stdin  = getStdHandle(STD_INPUT_HANDLE)

    Stdout = getStdHandle(STD_OUTPUT_HANDLE)

    Stderr = getStdHandle(STD_ERROR_HANDLE)

)


func getStdHandle(stdhandle uint32) (fd Handle) {

    r, _ := GetStdHandle(stdhandle)

    CloseOnExec(r)

    return r

}

該代碼的修復方法是刪除CloseOnExec調用,這是HANDLE_FLAG_INHERIT在給定文件句柄上清除的內容。

如何在你的項目中解決這個問題還不太清楚。我想你可以在你的項目中供應 golang.org/x/sys模塊,也許replace在你的 go.mod 中有一個指令。在您的本地副本中應用修復程序。

同時,我鼓勵您也報告該錯誤。該文檔指示您在 GitHub 的主要 Go 項目上報告問題,并在標題前加上x/sys前綴。



查看完整回答
反對 回復 2022-12-05
  • 1 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號