#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/stat.h>
int main(int argc, const char *argv[])
{
#if 0
//zomble_process
pid_t cpid = fork();
if (cpid > 0)
{
printf("parent: %d\n", getpid());
int wstatus;
pid_t res_cpid = waitpid(-1, &wstatus, 0);
if (res_cpid < 0)
{
perror("waitpid");
printf("%d\n", __LINE__);
return -1;
}
}
else if (0 == cpid)
{
printf("cpid: %d\n", getpid());
exit(0);
}
else
{
perror("fork");
printf("%d\n",__LINE__);
return -1;
}
#endif
#if 0
//noparent process
pid_t cpid = fork();
if (cpid > 0)
{
printf("parent: %d\n", getpid());
printf("parent exit\n");
exit(0);
}
else if (0 == cpid)
{
while(1)
{
sleep(1);
printf("cpid: %d\n", getpid());
}
}
else
{
perror("fork");
printf("%d\n",__LINE__);
return -1;
}
#endif
//ghost process
pid_t cpid = fork();
if (cpid > 0)
{
printf("parent: %d\n", getpid());
printf("parent exit\n");
exit(0);
}
else if (0 == cpid)
{
if (setsid() < 0)
{
perror("setsid");
printf("%d\n", __LINE__);
return -1;
}
if (chdir("/") < 0)
{
perror("chdir");
printf("%d\n", __LINE__);
return -1;
}
umask(0);
for(int i=0; i<getdtablesize(); i++)
{
close(i);
}
while (1)
{
printf("ghost: %d\n", getpid());
}
}
else
{
perror("fork");
printf("%d\n", __LINE__);
return -1;
}
return 0;
}