linux多线程【6】单实例的进程-记录锁的使用

来源:互联网 发布:电脑数据流量统计 编辑:程序博客网 时间:2024/05/16 16:12

    守护进程往往只维护一个实例,再次起一个进程时,检测到已经运行,就不会再运行了。这一点可以由记录锁来完成。


#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/stat.h>#include <errno.h>#include <syslog.h>#include <errno.h>#include <sys/types.h>#define LOCKFILE "/var/run/daemon.pid"#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)intisAlreadRun (void);intlockfile (int fd);int main(){   if(isAlreadRun())    {        printf("already run!\n");        return 0;    }    printf("first time!\n");    sleep(10);    printf("pid: %d; The only thing I do is sleep!\n", getpid());   return 0;}    //在整个文件上加锁  intlockfile (int fd){    struct flock fk;    fk.l_type = F_WRLCK;    fk.l_start = 0;    fk.l_whence = SEEK_SET;    fk.l_len = 0;    return (fcntl (fd, F_SETLK, &fk));}intisAlreadRun (void){    int fd;    char buf[16];    int errno;    fd = open (LOCKFILE, O_RDWR | O_CREAT, LOCKMODE);    if (fd < 0)      {  syslog (LOG_ERR, "can't open %s : %s", LOCKFILE, strerror (errno));  exit (1);      }    if (lockfile (fd) < 0)      {  if (errno == EACCES || errno == EAGAIN)    {close (fd);return (1);    }  syslog (LOG_ERR, "can't lock %s : %s", LOCKFILE, strerror (errno));  exit (1);      }    ftruncate (fd, 0);    sprintf (buf, "%ld", (long) getpid ());    write (fd, buf, strlen (buf) + 1);    return 0;}


    锁的是整个文件,所以其实也是文件锁。文件是

/var/run/daemon.pid
    如果不是root,执行的 时候需要sudo。在主函数中,测试
   if(isAlreadRun())
  

执行:

administrator@ubuntu:~/test$ sudo ./dae &                              后台运行[1] 3272                                                     administrator@ubuntu:~/test$ first time!                                                                                                    回车administrator@ubuntu:~/test$ sudo ./dae                                  第二次运行already run!                                                                                 检测到了第一次的运行,退出administrator@ubuntu:~/test$ sudo ./daealready run!administrator@ubuntu:~/test$ sudo ./daealready run!administrator@ubuntu:~/test$ sudo ./daealready run!administrator@ubuntu:~/test$ sudo ./daealready run!administrator@ubuntu:~/test$ pid: 3273; The only thing I do is sleep!                            第一次结束                                                                                                                                回车[1]+  完成                  sudo ./dae

如果已经运行,那么就退出。那么,第一次运行和第二次运行有什么不一样呢?
原创粉丝点击