|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$ J. ?: q" G" b# }% K+ t+ \Linux实例进程代码如下:6 N }5 @/ I+ L
- `# D9 F) l% v/ K
" m7 B- t, h% `% P8 H#include <stdio.h>
7 q- X& |4 T$ ^4 V+ L& S9 z, j8 g/ c( ?#include <stdlib.h>
0 ~- H- D! m/ k! k% j#include <unistd.h> ?% u1 q; y2 g5 W- E9 M$ d
#include <fcntl.h>, O* f; @3 N4 I& M; Z$ F: R h
#include <syslog.h>
9 Y+ c4 @' c* q, y" p& ? t: F#include <string.h>
. j% F1 s J% A+ X#include <errno.h>
; D. g5 J" @7 t4 L5 F- N' H( g#include <sys/stat.h>/ y! x, ^) |0 T9 P6 o
, w5 u4 e+ |" F1 E9 \
#define LOCKFILE "/var/run/mydaemon.pid"
& L. u; N4 [: J' \+ H#define LOCKMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
7 {/ a* B: | S/ ?
/ u, ?3 ?" s. m r6 {int lockfile(int fd)) G+ A5 x$ |$ o( q! W/ y
{
2 Z. ?. m/ G9 E7 u7 L( J struct flock fl;
4 D' X$ c4 k/ H) o5 Z+ r8 ~/ S5 u/ q# A' U9 B2 L
fl.l_type = F_WRLCK;
, {) q( I5 y! E& ~ fl.l_start = 0;
, z0 ?3 I- g3 J& N: S2 L fl.l_whence = SEEK_SET;
* k7 ~; d, j7 ], o' `. z5 f fl.l_len = 0;/ C) K1 V3 A* `! ^& ` v
. X9 R/ a: ?5 k! O7 _/ L3 X return(fcntl(fd, F_SETLK, &fl));( S3 t, B+ r; Q& A0 B# P" O0 u
}
9 E: ~6 Z; m4 L8 q3 m
; a/ z# z5 u/ f& O9 H$ ]int already_running(const char *filename)
$ u6 d- |2 ~( s" _- h{- f+ r& y- ]! y
int fd;
% S7 h7 H6 \, W/ | char buf[16];. Z, e/ v6 X( u5 H5 [$ I
/ H+ t) f) s+ E& p% ? fd = open(filename, O_RDWR | O_CREAT, LOCKMODE);3 T$ f* L8 P" k' u
if (fd < 0) { G( ?; S/ c% Z2 E4 m2 r7 B
syslog(LOG_ERR, "can't open %s: %m\n", filename);1 s7 i0 U" b; y9 a
exit(1);+ G5 X( ?& p2 g: {- M" v
}
* e1 y1 o( z+ n+ n1 w5 { if (lockfile(fd) == -1) {5 Q+ k' O- w9 G* s4 A# t- p9 X
if (errno == EACCES || errno == EAGAIN) {
, _+ L7 P4 A* f5 z syslog(LOG_ERR, "file: %s already locked", filename);
) t$ I! `! v! q1 X close(fd);+ |9 u F- ?5 b0 x6 b1 G4 a$ S! q
return 1;7 e3 |* @' q; [6 K4 l
}- ^/ W1 v# N( d9 f( O. T R
syslog(LOG_ERR, "can't lock %s: %m\n", filename);
" G2 b4 g5 S, a( ~2 l exit(1);
3 `6 m3 g) S9 s# \9 ^: t }$ d% _& x2 ]: q6 ~0 W% h- T
ftruncate(fd, 0);
) N- S. S8 z7 P sprintf(buf, "%ld", (long)getpid());7 H1 K" F1 {# D! {
write(fd, buf, strlen(buf) + 1);( l1 ^0 d9 ^) m- O( U& y
return 0;
1 h" B! M0 U6 P/ e}# J4 i, w. O% O
" J/ J. e7 t& @. wint main(int argc, char *argv[])) H" S: g# G; `8 A" h5 X
{1 [0 u% W4 U" p' d- p
if (already_running(LOCKFILE))
4 s( ^# p, a9 i! v4 m1 p& G' f return 0;
8 Q9 @7 r6 }# g* B, J, |2 } p; K
printf("start main...\n");
2 A0 E/ D+ }1 l6 h/ l. K sleep(100);
) m; p3 }% d: D! K. o printf("main done!\n");
4 P3 e7 M( `7 S2 D9 v
7 i- S4 r, l+ Z) G4 p! ]: P! D exit(0);
' E- L( x! i/ P3 l S}
3 |" O9 W& {: C) ~4 X- [) `5 K% N$ p L, d; v
1 h2 w7 }" S' ?2 ]/ f7 p8 B5 r$ s5 _
2 R1 @3 M# f, U7 b- g$ ?! w2 `
4 J q1 J& r! y2 ~
2 t8 L. I3 {+ K& ^ |
|