C++ 在用户上下文中从守护进程启动代理

C++ 在用户上下文中从守护进程启动代理,c++,macos,daemon,user-agent,launchd,C++,Macos,Daemon,User Agent,Launchd,我有一个在Mac OSX 10.6机器的登录上下文中运行的启动守护程序。我想从该代理为每个用户启动一个代理,并让该代理在用户的登录上下文中运行。但是,我需要非常小心地控制代理应用程序的精确参数,这就是为什么我不能像使用守护进程那样使用已启动的代理 如何创建在登录用户上下文中运行的进程?我已经完成了seteuid和setuid调用,但这些调用不会更改代理应用程序的执行上下文 我知道这不是苹果推荐的做法,但我真的没有选择的余地——守护程序应用程序的设计非常不灵活(它必须在许多不同的系统上运行)。是否

我有一个在Mac OSX 10.6机器的登录上下文中运行的启动守护程序。我想从该代理为每个用户启动一个代理,并让该代理在用户的登录上下文中运行。但是,我需要非常小心地控制代理应用程序的精确参数,这就是为什么我不能像使用守护进程那样使用已启动的代理

如何创建在登录用户上下文中运行的进程?我已经完成了
seteuid
setuid
调用,但这些调用不会更改代理应用程序的执行上下文

我知道这不是苹果推荐的做法,但我真的没有选择的余地——守护程序应用程序的设计非常不灵活(它必须在许多不同的系统上运行)。是否有一种变通方法允许我在登录用户的GUI上下文中,从登录上下文中运行的守护程序运行应用程序


<>我用C++,碳和可可。< /P> < P>使用启动代理。所有其他的方法都会用大量无用的细节和隐藏的技巧让你大吃一惊。总的来说,这是一项非常复杂的任务,有很多死角,并且很难正确实施。Launchd agent将允许您集中精力完成任务并节省大量时间

对您来说,最好的解决方案是重写代理,使其不使用命令行,而是连接到已启动的守护进程,并请求正确的选项/设置

如果不可能或很难,您可以编写包装启动代理,该代理将在启动时连接到守护进程,请求选项,然后使用适当的命令行启动原始代理

如果您认为实现“连接到守护进程”机制太难。。。也许是这样,但这比从守护进程在其他会话中启动代理要容易得多(当使用不同的角落案例支持正确实现时)

但是,如果你真的不管你想要什么,你都可以玩“launchctl-bsexec”。一些有效的例子: (它可以在会话上下文中启动任何可执行文件,而不是“launchctl load”)

这方面的一些更新

“使用launchctl bsexec”的意思是:

ps aux | grep loginwindow | grep user | awk'{system(“sudo launchctl bsexec”$2”sudo-u user/Applications/TextEdit.app/Contents/MacOS/TextEdit”)}

在您想要的会话中找到一些应用程序,获取其PID并调用“launchctl bsexec”在同一会话中运行您想要的程序。上面的示例将在登录的“用户”会话中启动TextEdit,即使该行是在另一个登录的用户帐户或服务下执行的

但我在Lion上测试了它——它不起作用。对我来说,它只适用于Leopards(10.5/10.6)。
我想说的是——不使用发射代理会让你屁股不断痛,其他什么都不会。在经历了十几次这样的事情之后,我们完全改用了launch Agent,现在我们很高兴:)

你能谈谈你是如何完全改用launch Agent的吗?因为我使用的是一个启动代理,我希望在安装后启动它,但该安装(特别是postflight脚本)是以root用户身份运行的。正如您所指出的,bsexec角度用于启动launch agent,但不是在Lion中。您如何让您的启动代理首先作为每个登录的用户启动?ps aux | grep loginwindow.app | grep-v grep | awk'{system(“sudo launchctl bsexec”$2“sudo-u”$1“launchctl load-S Aqua/Library/LaunchAgents/com.my.agent.plist”)},但如果您想显示一些UI,这在Lion上有一个问题。我们还没有解决它。埃斯米尔诺夫,没有。我记得,我们放弃了,只是在有几个用户登录时显示“重新启动pls”消息。