这是一个简单的“hello world”C程序,需要10秒才能完成:
#include<stdio.h>
main()
{
printf("hello World 1 \n");
fflush(stdout);
sleep(10);
printf("hello World 2 \n");
fflush(stdout);
}
如何修改它,以便最多只能在任何时刻运行此可执行文件的一个实例?我正在使用Linux。
例如,假设服务器崩溃,如果同时运行多个实例,我们正试图阻止这种情况。我希望看到一个或多个不同方式的示例,以便我可以在我的系统上运行和验证。
另外,是否有一种简单的方法可以对它们进行排队,所以如果我连续两次运行C可执行文件,第二个就在第一个完成后运行?
答案 0 :(得分:5)
通常,您通常会获取文件锁,创建给定文件名的运行时文件,并将进程PID作为初始化时的内容(在UNIX系统中通常位于/var/run/
中)。退出时删除文件。
如果文件在启动期间已存在,则另一个实例已在运行。
答案 1 :(得分:0)
假设我们将C程序命名为hello.c
,并使用:gcc -g hello.c -o hello.exe
进行编译。现在我们不是直接运行可执行文件,而是创建一个bash脚本来代替它运行它。 bash脚本检查是否存在虚拟锁文件,表明C程序正在运行。如果此锁定文件不存在,它会创建一个以便将来调用此bash脚本知道C程序正在运行。这是bash脚本:
#!/bin/sh
if [ ! -f dummy.file ];
then
echo "File not found. Let's create one now, then run hello.exe."
echo 'locked'> dummy.file
./hello.exe
else
echo "File dummy.file exists, so hello.exe is not run."
fi
现在我们只需要在上面的C程序中添加一些代码,让它在程序结束时删除文件,如下所示:
#include<stdio.h>
main()
{
printf("hello World 1 \n");
fflush(stdout);
sleep(10);
printf("hello World 2 \n");
fflush(stdout);
if (remove("dummy.file") == -1)
perror("Error in deleting lock file");
}
很简单。感谢skjaidev暗示这个解决方案(我将其作为答案)。