发新话题
打印

【求助】如何让自己的进程成为守护进程

【求助】如何让自己的进程成为守护进程

#include <stdio.h>: b% T; q% ?9 g* g. B
  #include <sys/ipc.h>
7 a8 v1 w% v0 G" K  #include <sys/sem.h>
5 P* S8 ?' l1 i" R) b" ]  #include <sys/shm.h>
7 t9 \3 x1 q0 v5 N# i( j  #include <sys/types.h>
; @3 k3 \" N8 i8 s6 |6 Y  #include <sys/stat.h>
& h  o/ p9 ^, U7 E. l  
4 v+ A9 M4 w$ K" ^  union semun ) t- D6 r+ y8 t2 q1 c& U
  {    / D* {) R7 S; @$ J, _
      int val;' i& H9 \+ ~7 L0 t/ p0 V
      struct semid_ds *buf;  h1 W: I/ q" a9 D$ m, Z
      unsigned short *array;% b  u" _6 Q% t+ T( M$ e- A8 z
  }arg;* C/ Z2 ~, g+ h8 }' ]
  
0 L" n1 V& \- z! O  f, Y3 H4 S. j  //生成信号量' n  g" q: Q4 X5 r
  int sem_creat(key_t key)# N* A; I6 ]9 t
  {
  s3 s0 M; p6 {9 O  v      union semun semopts;
+ L$ k( O' R+ |) b" L5 S4 g      int semid;
/ y" \6 ]$ U4 y8 t      
8 `" d2 |$ [% q* o; x      semopts.val = 0;8 c9 B; w+ p0 U0 L5 T4 t
      semid = semget(key, 1, IPC_CREAT|0666);
- R4 `7 ^0 e  Z      
& h# Q- B0 h" a, p+ a3 j      if (semid == -1)
# f; W( r7 K7 Z      {
) B/ K. x5 T9 q7 k9 \* z. x+ Z3 Z# f          printf("creat semaphore error\n");' r3 Y  O2 q9 ?* [8 T
          exit(-1);
  @) Z* j# U1 F6 J0 x- C- {3 {/ x% t      }& H" I$ c/ |8 u
      semctl(semid, 0, SETVAL, semopts);   //信号量初始化2 ]$ M/ b  g$ g& [3 `& C& G9 B' c% `
      return semid;
2 z# o2 r' \% N5 ^+ g# j" I  }0 l, F2 V/ N6 T9 k/ K- T/ _
  $ n# r" L2 k2 A- M6 Z! N6 y
  main()/ ]+ P7 l7 l) e
  {
, Z" A' ~) V3 j$ `      key_t key;5 U( J3 y# S5 ]/ H0 M/ ^
      union semun sem;/ H" ^6 ~! O( t
      int semid, shmid;
6 g2 T) m4 e" F; {! ^6 P      int *shm;" n1 N* q( s. Q( p& ~. U
      long int i;
1 y$ w% n  L+ N! k      int size;
  k% N3 ]4 q! C# l1 w9 _      
+ C0 O9 U( F1 z9 g- S      size = sizeof(long int);
% D" X" t, r5 D7 {# G0 J/ m      key = ftok("./3",0);4 q5 p* i! [/ w9 J" L8 Y
      shmid = shmget(key, size, IPC_CREAT|S_IRUSR|S_IWUSR);" W" J/ R3 |6 [# N6 k$ D5 B
      
& a6 ]7 p. e+ y/ O2 g. @      if (shmid == -1)
$ x8 u1 n$ z& t; T1 q# U5 b  T1 X      {
9 l/ p4 t# G6 o: K6 E- @0 V          perror("failed to create/get shm");; C1 Z% F# S# g. N* H* {: o2 p
          return -1;
1 ~! v. \7 q5 m4 E      }7 `, X% a: @( Z3 y
      % Q( q1 B+ d+ t% m* H( i
      shm = shmat(shmid, 0, 0);( J! z. C& Y5 G2 {$ @
      semid = sem_creat(key);
5 S1 R9 X" n  B! f/ K: c! g+ q: c0 v  
1 l7 k. Q, l  \) J! s# X      struct sembuf sem_get = {0,+1,IPC_NOWAIT};
. B( m. p: l! Z5 Q' n      semop(semid,&sem_get,1);6 M7 `) l# Z' y) ^3 [
      
8 Z/ q' z0 ?$ F) l' S: Q1 w5 s      for(i = 0;i<5000000;i++)( q, {# H; ^4 x  n* I- t
      {- {: `8 ^4 ^7 Z+ P: F4 a
          *shm += 1;) q: q4 u) W4 O5 W
      }) p3 U" k% [# M+ `7 z
      printf("%d\n",*shm);6 q: G4 O% `& |7 n: x
      
. V0 j4 ^9 w; S% z7 s5 h* s; E      struct sembuf sem_release = {0,-1,IPC_NOWAIT};8 a6 f  D; m4 z- t
      semop(semid,&sem_release,1);
/ @- ^+ U7 C; [+ p( _* b      
5 C' ~( S1 d; t+ Z      shmdt(shm);3 \8 {0 N6 y0 G+ ]
  }
9 E% p' c5 Q2 ~* _  " P5 [  o, `( O9 C* W
  
3 E" ?( v$ F, p9 Y5 v  这个程序需要守护进程模式.请问怎么改呢?:confused:

TOP

【原创】

我参考写的,运行正确的,加到你的代码里就可以了. J, C' L& V. q5 d: {; V
#include<syslog.h>% |5 |  x$ p. K2 W  }7 R% O5 c4 ?
#include<unistd.h>
  Y6 L! _. P! W; |! w4 d#include<sys/types.h>
+ M7 o0 n! w6 v#include<signal.h>
5 g2 n4 X1 \/ ~/ m* |+ t9 q4 s+ i#define MAXCLOSED 644 n; r* x1 e8 m" i  P
void daemon_init(const char *pname,int facility)
" M4 E' I/ x1 S9 v0 N/ Y{  ?0 ~) I7 A3 @( C5 o- g; t! }
int i;
5 r: p! H$ o/ ~& o' `) a, K pid_t pid;; i9 {% q$ r0 S
if((pid=fork()) != 0)
" I, n! y9 B( i2 [5 A2 ~  exit(0);% R4 ^. r5 c+ u
setsid();
( X+ P* s! o( h. v4 J! w signal(SIGHUP,SIG_IGN);$ C6 E9 n7 l8 n0 |% |8 B" _+ g; }
if((pid = fork()) != 0 )+ _% Q' W( @3 O$ f! q
  exit(0);
4 ^4 j" O+ b2 g" h chdir("/");
  H* Q* @" p6 m: ?3 \$ L/ D umask(0);
9 X! f1 n/ m: M1 A# J for(i = 0;i < MAXCLOSED; i ++)* J& c3 @2 v+ ?  [7 W
  close(i);
, ]* `! G( z. y! M/ R& H4 U openlog(pname,LOG_PID,0);; y. g" [8 s% E  ~+ O- Y9 U3 H' {
syslog(LOG_INFO|LOG_LOCAL1,"%s server start.......\n",pname);" ?) y. d! V% q. r" L; N
}

TOP

谢谢你 了.我去试下

TOP

发新话题