【问题标题】:Qt: Failed to find out application pid when run from binary using scriptQt:使用脚本从二进制文件运行时找不到应用程序 pid
【发布时间】:2016-10-25 09:11:32
【问题描述】:

我的目标是在应用程序运行时获取应用程序的 PID。 我写了一个简单的函数调用pgrep命令:

QString Scriptlauncher::getAppProcessId() {
    QProcess p;
    QString programme("pgrep");
    QStringList args = QStringList() << "app_name";
    p.start(programme, args);
    p.waitForReadyRead();
    QByteArray rdata = p.readAllStandardOutput();
    qDebug() << "------------- script output rawdata is:" << rdata;
    if (!rdata.isEmpty()) {
        QString pid(rdata);
        pid = pid.left(pid.length() -1); // cut '\n' symbol
        qWarning() << "APPLICATION pid is" << pid;
        return pid;
    }
    qWarning() << "failed to find out PID";
    return ("-1");
}

当我直接从 Qt 或使用简单脚本运行程序时(称为 execute.sh;它导出所有需要的共享库,然后运行应用程序二进制文件, - 从终端运行应用程序),上面的代码块返回正确价值:

user@host:/standalone_package/ execute.sh
------------- script output rawdata is: "21094\n"
APPLICATION pid is "21094"

但是当我从 valgrind heap profiler 命令运行 execute.sh 时,函数返回:

user@host:/standalone_package/ valgrind --tool=massif --trace-children=yes ./execute.sh
------------- script output rawdata is: ""
failed to find out PID

【问题讨论】:

  • valgrind 在一种“奇怪”的环境中执行你的二进制文件。所以 pgrep / shell 可能不可用。甚至/proc。您想找出您自己的 pid 还是其他应用程序之一?但这通常可能与 valgrind 有关。
  • 您想知道自己的 pid 还是其他应用程序的一个? 我想知道自己的应用程序的 pid。

标签: c++ linux qt shellcode


【解决方案1】:

感谢Hayt 提供链接!我找到了解决办法!

提供的second link 需要QProcess 对象的实例。我不知道如何获得它。

但是使用first link,我可以直接从应用程序和valgrind 下获得代码:

QString Scriptlauncher::getAppProcessId() {
    long pid = (long)getpid();
    qDebug ("------------- pid is %d", pid);
    QString pidstr = QString::number(pid);
    return pidstr;
}

【讨论】:

    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多