Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 确定进程是否正在运行?_C_Linux_Operating System_Process - Fatal编程技术网

C 确定进程是否正在运行?

C 确定进程是否正在运行?,c,linux,operating-system,process,C,Linux,Operating System,Process,有没有一种简单的方法来确定某个进程是否正在运行? 我需要知道我的程序的一个实例是否在后台运行,如果不是,请fork并创建后台进程。这通常是使用pidfiles完成的:一个位于/var/run/[name].pid中的文件,其中只包含fork()返回的进程ID 如果pidfile存在: 退出() 其他: 创建PID文件 pid=开始\背景() 写入(pid) 关闭时:删除文件 这通常是使用pidfiles完成的:一个位于/var/run/[name].pid中的文件,它只包含fork()返回的进程

有没有一种简单的方法来确定某个进程是否正在运行?
我需要知道我的程序的一个实例是否在后台运行,如果不是,请fork并创建后台进程。

这通常是使用pidfiles完成的:一个位于/var/run/[name].pid中的文件,其中只包含fork()返回的进程ID

如果pidfile存在: 退出() 其他: 创建PID文件 pid=开始\背景() 写入(pid) 关闭时:删除文件
这通常是使用pidfiles完成的:一个位于/var/run/[name].pid中的文件,它只包含fork()返回的进程ID

如果pidfile存在: 退出() 其他: 创建PID文件 pid=开始\背景() 写入(pid) 关闭时:删除文件
通常情况下,无种族歧视的做法是:

  • 打开锁文件/pid文件进行写入(但不要截断)
  • 尝试在不阻塞的情况下对其进行独占锁定(使用fcntl或flock)
  • 如果EAGAIN失败,那么另一个进程已经在运行
  • 文件描述符现在应该由守护进程继承,并在其生存期内保持打开状态
与简单地存储PID相比,这样做的优点是,如果有人重用PID,您不会得到误报


将pid存储在文件中的最大问题是,系统启动守护程序使用的编号较低的pid可能会在后续重新启动时被其他守护程序重用。我看到过这种情况。

通常情况下,无种族歧视的做法是:

  • 打开锁文件/pid文件进行写入(但不要截断)
  • 尝试在不阻塞的情况下对其进行独占锁定(使用fcntl或flock)
  • 如果EAGAIN失败,那么另一个进程已经在运行
  • 文件描述符现在应该由守护进程继承,并在其生存期内保持打开状态
与简单地存储PID相比,这样做的优点是,如果有人重用PID,您不会得到误报


将pid存储在文件中的最大问题是,系统启动守护程序使用的编号较低的pid可能会在后续重新启动时被其他守护程序重用。我已经看到了这种情况。

到目前为止,Linux软件基本上不关心程序的排他性,只关心它们使用的资源。“关怀”通常由实施提供(例如发行版的基础设施)

例如,如果您想运行一个程序,但该程序被锁定或变成僵尸,而您没有办法杀死它,或者它正在以另一个用户的身份运行,执行某些其他功能。为什么程序应该关心自身的另一个副本是否正在运行?让它这样做似乎只是一种不必要的限制

如果是一个进程打开了一个套接字(比如TCP端口),那么如果程序无法打开套接字,就让程序失败。如果它需要以独占方式访问某个文件,如果无法获取,则让它失败。支持PID文件,但不要强制使用


你会在GNU软件中看到这种方法,这是它如此多功能的一部分。

Linux软件基本上不关心程序的排他性,只关心它们使用的资源。“关怀”通常由实施提供(例如发行版的基础设施)

例如,如果您想运行一个程序,但该程序被锁定或变成僵尸,而您没有办法杀死它,或者它正在以另一个用户的身份运行,执行某些其他功能。为什么程序应该关心自身的另一个副本是否正在运行?让它这样做似乎只是一种不必要的限制

如果是一个进程打开了一个套接字(比如TCP端口),那么如果程序无法打开套接字,就让程序失败。如果它需要以独占方式访问某个文件,如果无法获取,则让它失败。支持PID文件,但不要强制使用


您将在GNU软件中看到这种方法,这是它如此多功能的一部分。

我在该文件夹中没有看到很多pid文件,缺少了很多。还有其他地方吗?根据规则,系统文件应该放在那里。如果您正在编写一个用户级程序,您可以将pid文件放在用户的主目录中(~/[name]/[name].pid)。很有可能——标准C I/O中很少有定义为原子的,因此这是很难避免的。在生成后台进程之前创建pidfile并保护清理,我认为风险应该可以忽略不计。请注意,
如果pidfile存在
也会触发旧的陈旧pid文件。您可能还希望检查pid文件的内容,至少验证进程是否处于活动状态,还可能检查进程的名称。我在该文件夹中没有看到太多pid文件,缺少太多。还有其他地方吗?根据规则,系统文件应该放在那里。如果您正在编写一个用户级程序,您可以将pid文件放在用户的主目录中(~/[name]/[name].pid)。很有可能——标准C I/O中很少有定义为原子的,因此这是很难避免的。在生成后台进程之前创建pidfile并保护清理,我认为风险应该可以忽略不计。请注意,
如果pidfile存在
也会触发旧的陈旧pid文件。您可能还希望检查pid文件的内容,并至少验证进程是否处于活动状态,还可能检查进程的名称。 if pidfile exists: exit() else: create pidfile pid = start_background() pidfile.write(pid) On shutdown: remove pidfile