- 论坛徽章:
- 0
|
现在要写一段代码,保证程序只运行一个实例,使用文件锁来完成。
在程序启动时,如果检测到有别的进程锁定了特定文件,就发送SIGUSR1信号给正在运行的那个进程,自己退出。
如后面的那段代码,如果直接用"gcc main.c -o test",那么编译生成的结果就没有任何问题,也能够完成预期的功能。一旦有一个进程在运行,那么以后的功能都会自动退出,第一个运行的进程每次都能收到SIGUSR1信号。
但是当编译的时候,使用"gcc -std=c99 main.c -o test"时,就会出现问题,首先,编译的时候会出现一个warning,
main.c:86: warning: implicit declaration of function `kill'
对于生成的程序,先执行一个,程序是正常的,然后再执行,可以正确发送信号,结果也正常,但是再执行一次的时候,就会出现错误,第三次执行的程序检测到了第一个进程,并发送信号给第一个进程,自己退出。但是第一个进程这个时候也会退出。
如果在SIGUSR1信号的handle函数中加入"signal (SIGUSR1, handle_sigusr1);",就不会出现这种情况。
实在不知道在c99中应该怎样给另一个进程发送消息,请各位高手指点一下。谢谢!
代码如下
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
static void
handle_sigusr1 (int value)
{
printf ("Get the signal SIGUSR1\n");
//signal (SIGUSR1, handle_sigusr1);
}
static pid_t
testlock (char *fname)
{
int fd;
struct flock fl;
fd = open (fname, O_WRONLY, S_IWUSR);
if (fd < 0)
{
if (errno == ENOENT)
{
return 0;
}
else
{
perror ("Test lock open file");
return -1;
}
}
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
if (fcntl (fd, F_GETLK, &fl) < 0)
{
close (fd);
return -1;
}
close (fd);
if (fl.l_type == F_UNLCK)
return 0;
return fl.l_pid;
}
static void
setlock (char *fname)
{
int fd;
struct flock fl;
fd = open (fname, O_WRONLY|O_CREAT, S_IWUSR);
if (fd < 0)
{
perror ("Set lock open file");
return ;
}
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
if (fcntl (fd, F_SETLK, &fl) < 0)
{
perror ("Lock file");
close (fd);
}
}
int
main (int argc, char* argv[])
{
pid_t lockapp;
lockapp = testlock ("/tmp/test.lock");
if (lockapp > 0)
{
kill (lockapp, SIGUSR1);
return 0;
}
setlock ("/tmp/test.lock");
signal (SIGUSR1, handle_sigusr1);
while (1)
{
sleep(10);
}
} |
|