对共享内存操作的部分代码进行了增强,修改了参数配置
This commit is contained in:
parent
ca80035633
commit
88e62a7962
|
|
@ -52,4 +52,5 @@ func main() {
|
|||
os.Exit(1)
|
||||
}
|
||||
logger.Info("Current configuration: %s", jsonData)
|
||||
configManager.Initialize(false)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package shm
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime/debug"
|
||||
"unsafe"
|
||||
|
||||
"bash_go_service/config-loader/internal/models"
|
||||
|
|
@ -28,11 +29,14 @@ func shmget(key int, size int, shmflg int) (int, error) {
|
|||
// shmaddr: 指定的附加地址(通常为 0 表示系统自动选择)
|
||||
// shmflg: 标志位,用于指定附加模式
|
||||
func shmat(shmid int, shmaddr uintptr, shmflg int) (unsafe.Pointer, error) {
|
||||
addr, _, errno := unix.Syscall(unix.SYS_SHMAT, uintptr(shmid), shmaddr, uintptr(shmflg))
|
||||
r1, _, errno := unix.Syscall(unix.SYS_SHMAT, uintptr(shmid), shmaddr, uintptr(shmflg))
|
||||
if errno != 0 {
|
||||
return nil, errno
|
||||
}
|
||||
return unsafe.Pointer(addr), nil
|
||||
// 通过 reflect.SliceHeader 进行转换
|
||||
var dummy [1]unsafe.Pointer
|
||||
*(*uintptr)(unsafe.Pointer(&dummy)) = r1
|
||||
return dummy[0], nil
|
||||
}
|
||||
|
||||
// shmdt 调用系统调用 SYS_SHMDT 将共享内存段从进程的地址空间分离
|
||||
|
|
@ -47,7 +51,24 @@ func shmdt(shmaddr unsafe.Pointer) error {
|
|||
|
||||
// WriteConfigToSharedMemory 将配置数据写入共享内存
|
||||
// config: 要写入的配置数据
|
||||
func WriteConfigToSharedMemory(config *models.ConfigData) error {
|
||||
func WriteConfigToSharedMemory(config *models.ConfigData) (err error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
logger.Error("Panic occurred while writing config to shared memory: %v", r)
|
||||
// 将panic转换为error返回
|
||||
switch x := r.(type) {
|
||||
case string:
|
||||
err = fmt.Errorf("panic: %s", x)
|
||||
case error:
|
||||
err = fmt.Errorf("panic: %w", x)
|
||||
default:
|
||||
err = fmt.Errorf("panic: %v", x)
|
||||
}
|
||||
// 打印调用栈信息
|
||||
debug.PrintStack()
|
||||
}
|
||||
}()
|
||||
|
||||
logger.Debug("Starting to write configuration to shared memory")
|
||||
|
||||
// 使用 unsafe.Alignof 获取对齐要求
|
||||
|
|
@ -62,7 +83,7 @@ func WriteConfigToSharedMemory(config *models.ConfigData) error {
|
|||
}
|
||||
|
||||
// 创建共享内存
|
||||
shmID, err := shmget(constants.ShmKey, int(alignedSize), unix.IPC_CREAT|0666)
|
||||
shmID, err := shmget(constants.ShmKey, constants.ShmSize, unix.IPC_CREAT|0666)
|
||||
if err != nil {
|
||||
// 获取更详细的错误信息
|
||||
switch err {
|
||||
|
|
@ -100,12 +121,37 @@ func WriteConfigToSharedMemory(config *models.ConfigData) error {
|
|||
}
|
||||
|
||||
// ReadConfigFromSharedMemory 从共享内存读取配置数据
|
||||
func ReadConfigFromSharedMemory() (*models.ConfigData, error) {
|
||||
func ReadConfigFromSharedMemory() (config *models.ConfigData, err error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
logger.Error("Panic occurred while reading config from shared memory: %v", r)
|
||||
// 将panic转换为error返回
|
||||
switch x := r.(type) {
|
||||
case string:
|
||||
err = fmt.Errorf("panic: %s", x)
|
||||
case error:
|
||||
err = fmt.Errorf("panic: %w", x)
|
||||
default:
|
||||
err = fmt.Errorf("panic: %v", x)
|
||||
}
|
||||
// 打印调用栈信息
|
||||
debug.PrintStack()
|
||||
}
|
||||
}()
|
||||
|
||||
logger.Debug("Starting to read configuration from shared memory")
|
||||
|
||||
// 获取共享内存段
|
||||
shmID, err := shmget(constants.ShmKey, constants.ShmSize, unix.IPC_CREAT|0640)
|
||||
// 读取时使用和写入时相同的权限
|
||||
shmID, err := shmget(constants.ShmKey, constants.ShmSize, 0666)
|
||||
if err != nil {
|
||||
switch err {
|
||||
case unix.EINVAL:
|
||||
logger.Error("Invalid size (%d) or key (%d)", constants.ShmSize, constants.ShmKey)
|
||||
case unix.EEXIST:
|
||||
logger.Error("Segment exists but cannot be accessed")
|
||||
default:
|
||||
logger.Error("Unexpected error: %v", err)
|
||||
}
|
||||
return nil, fmt.Errorf("shmget failed: %w", err)
|
||||
}
|
||||
|
||||
|
|
@ -116,16 +162,13 @@ func ReadConfigFromSharedMemory() (*models.ConfigData, error) {
|
|||
}
|
||||
defer shmdt(shmPtr) // 确保在函数结束时分离共享内存
|
||||
|
||||
// 创建一个新的配置数据对象
|
||||
config := new(models.ConfigData)
|
||||
configSize := unsafe.Sizeof(*config)
|
||||
if configSize > constants.ShmSize {
|
||||
return nil, fmt.Errorf("configuration size (%d) exceeds shared memory size (%d)", configSize, constants.ShmSize)
|
||||
}
|
||||
// 使用与写入相同的对齐方式
|
||||
align := unsafe.Alignof(models.ConfigData{})
|
||||
alignedPtr := unsafe.Pointer((uintptr(shmPtr) + align - 1) &^ (align - 1))
|
||||
|
||||
// 从共享内存复制数据到配置对象
|
||||
copy((*[constants.ShmSize]byte)(unsafe.Pointer(config))[:], (*[constants.ShmSize]byte)(shmPtr)[:])
|
||||
// 直接进行结构体复制
|
||||
config = new(models.ConfigData)
|
||||
*config = *(*models.ConfigData)(alignedPtr)
|
||||
|
||||
logger.Info("Configuration successfully read from shared memory")
|
||||
return config, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
package constants
|
||||
|
||||
const (
|
||||
MaxRules = 128 // 最大规则数量
|
||||
MaxArgs = 32 // 每条规则的最大参数数量
|
||||
MaxRules = 256 // 最大规则数量
|
||||
MaxArgs = 64 // 每条规则的最大参数数量
|
||||
MaxRuleCmdLength = 256 // 规则命令的最大长度
|
||||
MaxRuleTypeLength = 32 // 规则类型的最大长度
|
||||
MaxRuleMsgLength = 256 // 规则消息的最大长度
|
||||
MaxArgLength = 128 // 单个参数的最大长度
|
||||
ShmKey = 0x78945 // 共享内存的键值
|
||||
ShmSize = 1024 * 1024 // 共享内存的大小(字节)
|
||||
ShmSize = 32 * 1024 * 1024 // 共享内存的大小(字节)
|
||||
|
||||
SoPath = "/tmp/exec_hook" // 共享库路径
|
||||
SoName = "intercept.so" // Hook 文件名称
|
||||
|
|
|
|||
Loading…
Reference in New Issue