【发布时间】:2020-09-01 09:23:49
【问题描述】:
我目前正在用 C++ 构建一个守护进程,子进程由 fork() 语句创建。孩子们正在监听来自 Amazon SQS 队列的传入事件,并且在进程的生命周期循环中一切正常。
当从队列中读取一条新消息时,该进程必须执行一个外部二进制文件(已在 c++ 中使用动态库编译)。这个二进制文件的执行是由system(my_binary_path); 语句完成的。
问题是二进制文件需要DYLD_LIBRARY_PATH 已经在执行环境中设置,但它不是(因为执行是由子进程而不是当前用户会话进行的)。
我已经尝试直接从system("export DYLD_LIBRARY_PATH=<path-to-my-dylib-folder>") 函数导出DYLD_LIBRARY_PATH 环境变量。我也试过通过setenv("DYLD_LIBRARY_PATH", <path-to-my-dylib-folder>)函数设置,也没用。
我不知道设置 env 变量或使其与动态库一起使用的正确方法是什么,或者是否有任何其他替代方法可以执行外部二进制文件。
提前感谢您的帮助。
【问题讨论】:
-
不使用
system,您始终可以使用fork 和显式传递环境的exec系列函数之一。 -
不是治疗症状,而是通过正确配置二进制文件的 RPATH 来治疗疾病。
-
另外,DYLD 适用于 macOS。你的意思是
LD_LIBRARY_PATHfor Linux?