发新话题
打印

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

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

#include <stdio.h>( m# i/ R+ ~0 A
  #include <sys/ipc.h>
/ e$ ]3 q# D; y4 ], r' \$ n  #include <sys/sem.h>8 ^. G4 I# m5 X" W7 _9 Y" J2 P# N
  #include <sys/shm.h>
5 D- J! v8 I1 a  q, s+ f  #include <sys/types.h>
! y) n4 x) \  z9 w$ N  #include <sys/stat.h>+ Q$ u1 q+ ^# ~/ z3 Y+ {
  
/ K. c) n' @0 v! [0 d6 b- G1 K  union semun
1 o( d& p. a% i. E  {   
' ~  K8 g0 Z% ~      int val;3 V" ]1 {/ y& f: K0 j6 q9 W
      struct semid_ds *buf;
6 g1 I! `: h- z' i: _      unsigned short *array;6 Q; R" K. L3 E) r  d
  }arg;' O% p- O3 M- K9 H
  
) u$ i" U4 I/ [5 C* `  //生成信号量
" [1 d5 W  r: k% X( J* _% L  int sem_creat(key_t key)
$ e# N. _( a" g  {
( |/ G% F7 @7 z      union semun semopts;
% y, S8 F9 K" o      int semid;- B& l, Y- p; V6 G. O& T: {
      - p9 Z. \* ]/ @: l8 H' m3 d
      semopts.val = 0;, z' }5 ~1 m3 H; ?6 Y
      semid = semget(key, 1, IPC_CREAT|0666);
# s4 K# _5 F% P/ V) {# U3 E      
* C6 @3 z2 r7 B3 g: s) j      if (semid == -1)( N7 v8 V1 [2 ?: x% r
      {  C2 R. P5 l1 V
          printf("creat semaphore error\n");0 Q6 {6 l$ P' P( f* H
          exit(-1);
# |0 ~/ x6 R- j. E1 f) ^      }
; B% Q- {, v; w. [      semctl(semid, 0, SETVAL, semopts);   //信号量初始化
3 W# _4 d" q5 m2 {$ X      return semid;: i; o. e5 c' K# |* E! ]/ w
  }' w8 }% {- d( ^9 ~
  ) l1 _  [) [4 e1 R6 t
  main()4 T2 e1 u: b0 c7 g% b7 U
  {9 }1 I/ L+ ?8 H6 r$ I+ U% L
      key_t key;
# Q! ]( Y* }, q# H      union semun sem;" P6 ~/ S- }. W( ?
      int semid, shmid;
/ R; C' s: x0 p/ K      int *shm;/ d. L( a) ~4 p- N7 v
      long int i;
8 Y+ E' J  \% G; q, G8 ?      int size;
  L8 m( g  j& Q& d% ?      6 p# K* H, h+ G. Q' ^9 ]7 ^0 K: l
      size = sizeof(long int);5 _; O# U, _+ ^2 I  y
      key = ftok("./3",0);
) o$ i/ m' e9 o      shmid = shmget(key, size, IPC_CREAT|S_IRUSR|S_IWUSR);: A$ T1 W9 Q6 I; \7 Z% b
      
- V$ q4 Y0 y6 H6 y2 g, l9 p& N      if (shmid == -1)
% |6 f+ f; s' {# h9 @      {
" W0 F* K% ?- I+ o& O          perror("failed to create/get shm");
2 L% u) B; S5 P% B! ~5 c          return -1;" v5 k. L$ t% |( ^% d. E& c
      }4 j4 s5 G- O$ h4 n" r. ?
      7 q2 J. X2 F& D# n! P" t
      shm = shmat(shmid, 0, 0);
) |' l/ f/ Z! l+ z6 @$ Z2 c( o      semid = sem_creat(key);1 L$ f7 P0 \; Z( F8 m
  : b# L) u+ A1 f/ S
      struct sembuf sem_get = {0,+1,IPC_NOWAIT};7 S& y+ @  b# `
      semop(semid,&sem_get,1);
7 C& B2 E, V2 }  Z      
% m  I, U/ @! f' d. Q* s      for(i = 0;i<5000000;i++)+ T7 q, h' v3 K. J8 v% Y
      {+ o, j6 K8 Y5 n( a8 s& O
          *shm += 1;+ P% O* V! c; G! P
      }8 z: t  Y3 f+ `% v1 Z# y
      printf("%d\n",*shm);8 W0 H1 H# H' p# v8 x* F9 K4 T# W
      " ?8 X5 }; x3 F2 i* ^  ^5 P; r
      struct sembuf sem_release = {0,-1,IPC_NOWAIT};
% Y# @( d! [- J" [: [      semop(semid,&sem_release,1);. [& n  K" m' {! ~8 @6 ~1 @
      
  c) x+ P% i1 k% ~( z      shmdt(shm);1 {+ a$ t# I5 y  F* n) b
  }- \) `) z+ r, O7 I
  
. g' Q& g. [: k  # B! I, Z8 ~. ~7 l0 V/ ~
  这个程序需要守护进程模式.请问怎么改呢?:confused:

TOP

【原创】

我参考写的,运行正确的,加到你的代码里就可以了1 C8 h7 _; f7 {$ e6 e. H
#include<syslog.h>
% T1 [# y& {+ X#include<unistd.h>' q0 o& |, t9 z
#include<sys/types.h>
5 e' g* q' A- ]8 ~- o" D! L" s#include<signal.h>7 ]# D; G% Y& D
#define MAXCLOSED 64: @1 q0 R+ `7 \" }
void daemon_init(const char *pname,int facility)
: K) h, U/ E; t& [# Z{3 o1 l* E5 F; S" \$ g( W, L! i
int i;$ a7 A- b% ^# u: z9 \
pid_t pid;
# t8 v$ b1 q' n* I1 ? if((pid=fork()) != 0)
, G6 k5 h" M/ t) n1 s  exit(0);
! H) x$ W. J8 ?2 y setsid();9 b+ d$ N2 _4 I  ?. G
signal(SIGHUP,SIG_IGN);
4 m/ a3 K& ]2 b4 M6 @: y( C0 c* J if((pid = fork()) != 0 )+ y1 h) X4 o' J
  exit(0);% _0 ?& J+ v5 O( C! I! c
chdir("/");
$ F! ]3 s. v( ?# Y& `! o umask(0);
/ S8 g5 e1 j2 ^' I( z for(i = 0;i < MAXCLOSED; i ++)0 m! ^7 O9 Q+ s" a5 E
  close(i);) P0 a% R& Q* _' R# R6 S6 W3 ]
openlog(pname,LOG_PID,0);& t0 b0 j' Z" x6 |- f: t; W
syslog(LOG_INFO|LOG_LOCAL1,"%s server start.......\n",pname);
6 |; k8 Q5 c" ]& i$ `}

TOP

谢谢你 了.我去试下

TOP

发新话题