我一直在使用我发现的修改过的类来检查同一进程的另一个实例是否已经在运行,问题是检查进程的方法添加了同一进程的另一个实例。
当我的应用程序启动时,一个新的进程 ID 被创建并且可见:
ps -A | grep "AppName"
有了这个,我得到了一个 since 条目返回,然后我使用以下方法检查应用程序的另一个实例:
QString strCMD = "ps -A | grep \"" + mcstrAppName + "\"";
QProcess objProc;
objProc.start("bash", QStringList() << "-c" << strCMD);
if ( objProc.waitForStarted() != true || objProc.waitForFinished() != true ) {
mcpobjApp->exit(cleanExit(-1, "Unable to determine if another instance is running!"));
return;
}
一旦“start”方法被调用,同一个应用程序的另一个实例就会出现在进程表中,再次验证:
ps -A | grep "AppName"
现在出现两个条目,每个条目都有不同的 PID。我也试过:
QString strOptions = "-A | grep \"" + mcstrAppName + "\"";
QProcess objProc;
objProc.start("ps", QStringList() << strOptions);
结果是一样的,进程表中有两个条目。
有没有办法在不添加额外实例的情况下检查另一个实例的进程表?
最佳答案
我建议使用 pid 文件。这是 Linux 上守护进程的标准程序。
int createPidFile(const char *pidFile, int flags)
{
int fd;
char buf[BUF_SIZE];
fd = open(pidFile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (fd == -1)
errExit("Could not open PID file %s", pidFile);
if (flags & CPF_CLOEXEC)
{
/* Set the close-on-exec file descriptor flag */
flags = fcntl(fd, F_GETFD); /* Fetch flags */
if (flags == -1)
errExit("Could not get flags for PID file %s", pidFile);
flags |= FD_CLOEXEC; /* Turn on FD_CLOEXEC */
if (fcntl(fd, F_SETFD, flags) == -1) /* Update flags */
errExit("Could not set flags for PID file %s", pidFile);
}
return fd;
}
来源Linux 编程接口(interface)
这会创建一个文件并将其锁定,这样其他进程就无法打开它。它在退出时将其标记为关闭,因此当进程通过正常或异常终止退出时文件将关闭。如果您的程序实例已经在运行,则此函数将失败,您可以退出。
编辑: pid 文件应该在临时分区中。具体位置因您的发行版而异,只需查看您系统中其他守护进程创建其 pid 文件的位置即可。
关于c++ - 如何检查进程是否在 Red Hat Linux 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44324898/