国产化-普通GUI进程以root身份调用其他程序

国产化-普通用户GUI进程以root身份调用其他程序

普通用户以root身份调用其他程序的常规方法

  1. sudo
    sudo没有提供密码框,不适合普通GUI进程调用。
  2. pkexec
    pkexec提供密码框,但也有缺点。
#include <iostream>

#include <unistd.h>

int main() {
    using namespace std;
    pid_t  pid = fork();
    if (pid == 0)
    {
        std::cout << "fork() successfully." << endl;
        const char *env_init[] = {"DISPLAY=:0", nullptr};
        const char cmd[] = "/usr/bin/echo";
        execle("/usr/bin/pkexec", "pkexec", cmd, nullptr, env_init);
    }
    // 以下的输入等待很必要,否则pkexec会调用不起来,报错“Refusing to render service to dead parents.”
    int i;
    cin >> i;
    return 0;
}

推荐方法

实测在中标麒麟和中科方德系统的普通用户进程调用pkexec以root身份运行其他程序有可能不弹出密码框。另外如果pkexec的调用者提前退出会导致pkexec运行失败,报错"Refusing to render service to dead parents."。所以调用pkexec的程序必然会堵塞等待,在很多场合不适用。
root身份运行的守护进程+进程间通信则是解决此难题的方法,因为root身份运行的守护进程调用的程序可以继承root身份,完美避开输入密码的步骤。普通GUI进程可以通过进程间通信向守护进程发出调用其他程序的请求,然后无需等待即可返回,避免了阻塞的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值