网上暂时找到两个方法:
第一种方式问题是需要文件锁,而 win 不支持文件锁。 第二种不知道 win 是否支持,但是如果进程启动后被 kill 掉,那么环境变量依然存在,还会被视为重复运行。
我想实现如果首次执行就后台运行,开始监听端口,等待被调用业务函数。 如果已经执行,就显示菜单,等待输入业务指令。
请教大佬还有哪些办法可以判断自身已经被执行?
hash 自身程序?然后在进程里对比?是不是太极端了?进程里找程序名会不会太不严谨?求教!
1 statumer 2022-05-06 05:00:11 +08:00 via iPhone |
![]() | 2 xyjincan 2022-05-06 06:44:50 +08:00 via Android 绑定一个端口 |
![]() | 3 Livid MOD PRO ![]() 如果有配置文件,那么可以把 PID 位置在配置文件里指定,端口也可以在配置文件里指定。 如果端口或者 PID 存在,并且端口上能够正确应答,那就可以认为是已经在运行了。 |
![]() | 4 snowlyg 2022-05-06 08:24:53 +08:00 ![]() 喊它一声,看它敢不敢答应 |
5 GuuJiang 2022-05-06 08:26:30 +08:00 via iPhone mutex |
![]() | 6 PolarBears 2022-05-06 08:53:14 +08:00 获取自身进程路径然后找找系统进程有没有里有没有相同路径 |
![]() | 7 est 2022-05-06 08:57:10 +08:00 windows 有一个机制好像会生成一个唯一的 GUID 然后可以保证单例运行。 https://www.c-sharpcorner.com/UploadFile/f9f215/how-to-restrict-the-application-to-just-one-instance/ |
![]() | 8 est 2022-05-06 08:57:28 +08:00 |
![]() | 9 bruce0 2022-05-06 08:59:27 +08:00 一看看过 C++的相关东西, 有一次无意听到我 CTO 说过 常用的有检查文件,每次成功启动在指定目录写一个文件; 还一种方式就是监听端口, 但是我想了一下 这个不能使用 端口复用这个特性 |
10 jinliming2 2022-05-06 09:15:13 +08:00 windows 下可以通过 CreateMutex 创建互斥量来做进程间的互斥访问。所以可以条件编译,windows 下用 windows 的方式,linux 下用 linux 的方式。 另外,既然你需要在执行后监听端口,那么如果没有开启 SO_REUSEPORT 的话,应该第二个进程在尝试监听同一个端口的时候就会失败,捕获这个 error 不就可以实现互斥了吗? |
11 hhaobao 2022-05-06 09:17:29 +08:00 CreateMutexW, 具体代码就不贴了, 自己看一些网游 ,还有一些不准多开的软件, 还有比如微信, 你用 process hacker 把它的 mutex 关了就可以多开了 |
![]() | 12 lysS 2022-05-06 09:18:20 +08:00 |
![]() | 13 jasonkayzk 2022-05-06 10:49:07 +08:00 绑定到一个固定的端口,第二个服务就起不来了 |
![]() | 15 czyt 2022-05-06 12:36:43 +08:00 |
16 raw0xff OP @Livid 有配置文件,正在按你说的尝试,应该可以 @snowlyg 简明扼要通俗易懂! @PolarBears 不严谨,如果是不同路径的相同程序呢 @est 谢谢我瞅瞅先 @bruce0 检查端口会有两种可能,一种是已运行,另一种是端口被其他程序占用了 @jinliming2 @jasonkayzk 监听的端口不固定,而且允许用户自定义监听端口,所以不能作为唯一判断。 @hhaobao mark 一下,稍后学习 @lysS @czyt 感谢 |
![]() | 17 biubiuF 2022-05-06 14:05:52 +08:00 每次启动尝试一下删除文件,删除成功就创建一个新的文件并且 hold 住,然后启动实例 |
18 Baloneo 2022-05-06 14:09:33 +08:00 设置进程名 |
19 zjj19950716 2022-05-06 15:10:10 +08:00 github.com/gofrs/flock 用的这个文件锁,有 win 实现 |
![]() | 20 sdrzlyz 2022-05-07 10:52:46 +08:00 启 udp...然后做好应答。 另一个启的时候,广播含一嗓子,有正确应答就是已经启动了 狗头保命 |
![]() | 21 Akiya 2022-05-07 19:33:34 +08:00 via iPhone 一般是用文件锁 |