/****************************************************************
创建守护进程函数
****************************************************************/
#include <sys/types.h>;
#include <unistd.h>;
void daemonize (int servfd)
int servfd;
{
int childpid, fd, fdtablesize;
/*忽略终端I/O读、写和stop 信号*/
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
/*通过fork子进程,kill父进程,把自身转入后台*/
if ((childpid=fork())< 0)
{
fputs("failed to fork first child/r/n",stderr);
exit(1);
}
else if (childpid>;0)
exit(0); /*若是父进程,结束*/
/*设为会话组长,摆脱原终端*/
setsid() ;
/*释放控制终端*/
if((fd=open("/dev/tty",O_RDWR))>;=0)
{
ioctl(fd,TIOCNOTTY,NULL);
close(fd);
}
/*关闭除 servfd 外的所有文件描述符*/
for (fd =0,fdtablesize=getdtablesize();fd<fdtablesize;fd++)
if (fd != servfd)
close(fd);
/*改变工作目录到根目录*/
chdir("/");
/*重设文件掩码*/
umask(0);
}
#include <stdio.h>;
#include <stdlib.h>;
#include <unistd.h>;
#include <sys/wait.h>;
#include "restart.h"
int makeargv(const char *s, const char *delimiters, char ***argvp);
int main(int argc, char *argv[]) {
pid_t childpid;
char delim[] = " /t";
char **myargv;
if (argc != 2) {
fprintf(stderr, "Usage: %s string/n", argv[0]);
return 1;
}
childpid = fork();
if (childpid == -1) {
perror("Failed to fork");
return 1;
}
if (childpid == 0) { /* child becomes a background process */
if (setsid() == -1)
perror("Child failed to become a session leader");
else if (makeargv(argv[1], delim, &myargv) == -1)
fprintf(stderr, "Child failed to construct argument array/n");
else {
execvp(myargv[0], &myargv[0]);
perror("Child failed to exec command");
}
return 1; /* child should never return */
}
return 0; /* parent exits */
}