C 使用参数调用Linux服务
我在Linux操作系统中有一个守护进程,我想在守护进程运行时从另一个C文件(守护进程控制器)向这个守护进程传递参数 我用谷歌搜索它,但到目前为止我手里什么都没有。你能给我一些窍门吗?也许你能举个例子 我拥有的守护程序是从此网站复制/粘贴的:C 使用参数调用Linux服务,c,linux,service,daemon,C,Linux,Service,Daemon,我在Linux操作系统中有一个守护进程,我想在守护进程运行时从另一个C文件(守护进程控制器)向这个守护进程传递参数 我用谷歌搜索它,但到目前为止我手里什么都没有。你能给我一些窍门吗?也许你能举个例子 我拥有的守护程序是从此网站复制/粘贴的: 您没有明确说明控制器是从公共父级启动的相关进程还是不相关的进程。如果它是相关的,您可以在控制器和守护进程之间安排一个管道;如果没有,您可以使用Unix域套接字(请参阅手册页unix7)或FIFO mknod文件名p。无论哪种方式,都可以用一个块来替换休眠调用
您没有明确说明控制器是从公共父级启动的相关进程还是不相关的进程。如果它是相关的,您可以在控制器和守护进程之间安排一个管道;如果没有,您可以使用Unix域套接字(请参阅手册页unix7)或FIFO mknod文件名p。无论哪种方式,都可以用一个块来替换休眠调用,该块包括选择或轮询调用,查找控制流和任何其他感兴趣的文件或套接字上的数据,如果有数据,则读取数据,解析数据,并对其执行操作。read;您可以为两个进程之间的通信定义一个协议;也许考虑一些JSON-RPC,或HTTP等…如果某个程序正在启动此守护进程,请通过mainit argc、char**argv传递参数。阅读Exeve手册页。
/*
UNIX Daemon Server Programming Sample Program
Levent Karakas <levent at mektup dot at> May 2001
To compile: cc -o exampled examped.c
To run: ./exampled
To test daemon: ps -ef|grep exampled (or ps -aux on BSD systems)
To test log: tail -f /tmp/exampled.log
To test signal: kill -HUP `cat /tmp/exampled.lock`
To terminate: kill `cat /tmp/exampled.lock`
*/
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define RUNNING_DIR "/tmp"
#define LOCK_FILE "exampled.lock"
#define LOG_FILE "exampled.log"
void log_message(filename,message)
char *filename;
char *message;
{
FILE *logfile;
logfile=fopen(filename,"a");
if(!logfile) return;
fprintf(logfile,"%s\n",message);
fclose(logfile);
}
void signal_handler(sig)
int sig;
{
switch(sig) {
case SIGHUP:
log_message(LOG_FILE,"hangup signal catched");
break;
case SIGTERM:
log_message(LOG_FILE,"terminate signal catched");
exit(0);
break;
}
}
void daemonize()
{
int i,lfp;
char str[10];
if(getppid()==1) return; /* already a daemon */
i=fork();
if (i<0) exit(1); /* fork error */
if (i>0) exit(0); /* parent exits */
/* child (daemon) continues */
setsid(); /* obtain a new process group */
for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */
i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */
umask(027); /* set newly created file permissions */
chdir(RUNNING_DIR); /* change running directory */
lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
if (lfp<0) exit(1); /* can not open */
if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */
/* first instance continues */
sprintf(str,"%d\n",getpid());
write(lfp,str,strlen(str)); /* record pid to lockfile */
signal(SIGCHLD,SIG_IGN); /* ignore child */
signal(SIGTSTP,SIG_IGN); /* ignore tty signals */
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGHUP,signal_handler); /* catch hangup signal */
signal(SIGTERM,signal_handler); /* catch kill signal */
}
main()
{
daemonize();
while(1) sleep(1); /* run */
}
/* EOF */