#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
void init_daemon()
{
int pid;
int i;
if(pid = fork() > 0)
{
fprintf(stdout, "parent exit %d\n",getpid() );
exit(0);
}
else if(pid < 0)
{
fprintf(stdout, "fork error%d\n",getpid() );
exit(1);
}
/* 子进程继续执行 */
setsid(); //创建新的会话组,子进程成为组长,并与控制终端分离
return;
}
int main(int argc, char **argv)
{
FILE *fp;
int status, pid, ret;
if (argc < 2) {
fprintf(stderr, "Usage:%s <exe_path> <args...>\n", argv[0]);
return -1;
}
//signal(SIGCHLD, SIG_IGN); /* 忽略子进程结束信号,防止出现僵尸进程*/
init_daemon();
while(1)
{
/* 防止子进程(组长)获取控制终端*/
if( ( pid = fork() ) < 0 )
exit(0); //错误,退出
else if (pid == 0) { //child
fprintf(stdout, "start execv %s ,pid:%d\n",argv[1],getpid());
ret = execv(argv[1], argv);
if (ret < 0) {
fprintf(stdout, "%s,execv ret:%d errno:%d\n", argv[1],ret, errno);
continue;
}
fprintf(stdout, "end execv stprn ,pid:%d\n",getpid());
exit(0);
}
else if (pid > 0) {
fprintf(stdout, "wait pid:%d,cur pid:%d\n",pid, getpid());
waitpid(pid,NULL,0);
fprintf(stdout, "wait return,pid:%d\n",getpid());
}
}
return 0;
}