Linux进程单例模式运行
# include <iostream>
# include <stdlib.h>
# include <unistd.h>
# include <string.h>
# include <stdio.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h> int write_pid ( const char * pidFile)
{ char str[ 32 ] = { 0 } ; int fd = open ( pidFile, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR) ; if ( fd < 0 ) { printf ( "can't open pidfile %s.\n" , pidFile) ; exit ( 1 ) ; } if ( lockf ( fd, F_TLOCK, 0 ) ) printf ( "can't lock pidfile %s.\n" , pidFile) ; exit ( 0 ) ; } sprintf ( str, "%d\n" , getpid ( ) ) ; ssize_t len = strlen ( str) ; if ( write ( fd, str, len) != len) { printf ( "can't write pid %s.\n" , pidFile) ; exit ( 0 ) ; } fdatasync ( fd) ; printf ( "write pid file %s.\n" , pidFile) ; return fd;
} int main ( )
{ int pid_fd = write_pid ( "server.pid" ) ; while ( 1 ) { ; } lockf ( pid_fd, F_ULOCK, 0 ) ; close ( pid_fd) ;
}
终端1
[ banting@localhost test] $ ls -tlr
-rw-rw-r--. 1 banting banting 834 Jun 30 15 :53 test75.cpp
-rwxrwxr-x. 1 banting banting 19760 Jun 30 16 :03 test75
[ banting@localhost test] $ g++ -g test75.cpp -o test75
[ banting@localhost test] $
[ banting@localhost test] $ ./test75
write pid file server.pid.
终端2
[ banting@localhost test] $ ps -ef | grep test75
banting 519636 596192 99 16 :03 pts/38 00:00:38 ./test75
banting 519676 518705 0 16 :04 pts/96 00:00:00 grep --color= auto test75
[ banting@localhost test] $ cat server.pid
519636
[ banting@localhost test] $ ./test75
can't lock pidFile server.pid.
[ banting@localhost test] $