想用daemon(0,0)函数创建单实例守护进程,但加了该函数后两个进程可以对同一文件上锁。下面是我的测试程序,图片是测试输出(打开的第二个进程):把daemon注释掉后输出-1显示锁失败,进程退出;但加上daemon后输出0,锁成功了。这是为什么???求教!!
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <syslog.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
int lockfile(int fd)
{
struct flock fl;
int num;
fl.l_type = F_WRLCK;
fl.l_start = 0;
fl.l_whence = SEEK_SET;
fl.l_len = 0;
num = fcntl(fd,F_SETLK,&fl);
printf("lock : %d",num);
return(num);
}
void add()
{
int fd;
char buf[16];
fd = open("a.txt", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(fd < 0)
{
printf("can't open");
exit(1);
}
int num;
num = lockfile(fd);
printf("num : %d\n",num);
if(num < 0){
printf("num : %d\n",num);
if(errno == EACCES || errno == EAGAIN)
{
printf("lock\n");
close(fd);
exit(1);
}
printf("can't lock");
exit(1);
}
ftruncate(fd,0);
sprintf(buf, "%ld",(long)getpid());
write(fd, buf, strlen(buf)+1);
return 0;
}
int main()
{
FILE *fp;
add();
daemon(0,0);
while(1)
{
sleep(20);
fp=fopen("tt.log","a");
if(fp>=0)
{fprintf(fp,"aaaa");
fclose(fp);
}
else
exit(1);
}
exit(0);
}