付伯言 2019-05-19 22:54
浏览 293

使用daemon(0,0)函数后两个进程可以对同一文件上锁

想用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);
}

图片说明

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 对于相关问题的求解与代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
    • ¥15 保护模式-系统加载-段寄存器
    • ¥15 电脑桌面设定一个区域禁止鼠标操作
    • ¥15 求NPF226060磁芯的详细资料