当前位置: 首页 > 面试题库 >

以编程方式确定程序是否正在运行

易书
2023-03-14
问题内容

在C语言中,如何以编程方式找出Linux / Ubuntu上是否已在运行某个进程,以避免该进程两次启动?我正在寻找类似于pidof的东西。


问题答案:

您可以进入这些pid条目/proc并在cmdline文件中检查过程,也可以readlinkexe链接上执行操作(以下使用第一种方法)。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>

pid_t proc_find(const char* name) 
{
    DIR* dir;
    struct dirent* ent;
    char* endptr;
    char buf[512];

    if (!(dir = opendir("/proc"))) {
        perror("can't open /proc");
        return -1;
    }

    while((ent = readdir(dir)) != NULL) {
        /* if endptr is not a null character, the directory is not
         * entirely numeric, so ignore it */
        long lpid = strtol(ent->d_name, &endptr, 10);
        if (*endptr != '\0') {
            continue;
        }

        /* try to open the cmdline file */
        snprintf(buf, sizeof(buf), "/proc/%ld/cmdline", lpid);
        FILE* fp = fopen(buf, "r");

        if (fp) {
            if (fgets(buf, sizeof(buf), fp) != NULL) {
                /* check the first token in the file, the program name */
                char* first = strtok(buf, " ");
                if (!strcmp(first, name)) {
                    fclose(fp);
                    closedir(dir);
                    return (pid_t)lpid;
                }
            }
            fclose(fp);
        }

    }

    closedir(dir);
    return -1;
}


int main(int argc, char* argv[]) 
{
    if (argc == 1) {
        fprintf("usage: %s name1 name2 ...\n", argv[0]);
        return 1;
    }

    int i;
    for(int i = 1; i < argc; ++i) {
        pid_t pid = proc_find(argv[i]);
        if (pid == -1) {
            printf("%s: not found\n", argv[i]);
        } else {
            printf("%s: %d\n", argv[i], pid);
        }
    }

    return 0;
}


 类似资料:
  • 问题内容: 如何检查Glassfish DAS是否以编程方式运行,即使已将其部署在本地计算机还是远程计算机上? 使用Java6 问题答案: 我找到了一种方法来检查DAS是否已启动,而不是Linux脚本。通过这种方式,我的应用程序和DAS都在同一台计算机上还是每台安装在不同的计算机上都没有关系。 }

  • 问题内容: 正如问题所指出的那样,我主要想知道我的代码是否正在模拟器中运行,但也想知道正在运行或正在模拟的特定iphone版本。 编辑:我在问题名称中添加了“以编程方式”一词。我的问题的关键是能够根据正在运行的版本/模拟器动态地包含/排除代码,因此我真的在寻找可以提供此信息的预处理器指令之类的东西。 问题答案: 已经问过,但标题却大不相同。 为iPhone编译时Xcode设置了什么#define

  • 问题内容: 我需要一个独立于平台的(Linux / Unix | OSX)shell / bash命令,该命令将确定特定进程是否正在运行。例如,…最简单的方法/命令是什么? 问题答案: 尽管和是确定正在运行的工具的绝佳工具,但不幸的是,它们在某些操作系统上均不可用。确定的故障保护将使用以下内容: Gentoo Linux上的输出: OS X上的输出: 在Linux和OS X上,grep都会返回退出

  • 给定一个卷,如何确定它是否加密?我发现了像DADiskCopyDescription()和NSURL的getResourceValue:forKey:error这样的东西:它们提供了丰富的信息,但并没有提供卷是否加密。 即使没有公共API,从操作系统附带的命令行工具中抓取输出也是可以接受的。我发现最接近的是“diskutil info /dev/disk0”,但同样没有加密信息。令人讨厌的是,当您

  • 问题内容: 我的应用程序会定期在屏幕上显示信息。但是,如果屏幕截图处于活动状态,则应用程序应等待用户返回。 有什么方法可以确定屏幕保护程序是否正在运行? 我不需要干净的解决方案,您只需要在Windows XP上工作即可。 问题答案: 尝试使用JNA库来调用SystemParametersInfo系统调用。 下面的示例使用JNA提供的win32示例中的代码:

  • 考虑到JAXB注释的对象,是否有办法确定类/字段/方法在封送过程中是否会导致xsi: type? 是XmlElement注释, 我唯一需要担心的情况? 我正在编写一个Lua解组器,在这里我们删除了很多常见的xml类型信息,我正在尝试找出如何将传入的Lua与JAXB匹配。 谢谢 --更新-- 下面是一个简单的示例,说明了问题: 当我收到一个动物对象时,我可以查询动物的注释来检测它应该是狗或猫而不是动