#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
int main(int argc, const char *argv[])
{
pid_t cpid=fork();
/僵尸进程
/* if(0==cpid) //子进程
{
printf("this is child %d %d\n",getpid(),getppid());
exit(0); //子进程结束后,父进程没有回收,就成为僵尸进程,
} //僵尸进程可以通过关闭父进程或者父进程wait/waitpid指令回收解决
else if(cpid>0)
{
while(1)
{
printf("this is parent!!!\n");
sleep(1);
}
}
else
{
perror("fork");
return -1;
}
*/
//孤儿进程
/* if(0==cpid)
{
while(1)
{
printf("this is child! %d %d\n",getpid(),getppid());
sleep(1);
}
}
else if(cpid >0)
{
printf("this is parent!!!!\n");
} //父进程运行结束后,子进程还在运行的,成为孤儿进程,孤儿进程被1好进程收养
else //孤儿进程不可以通过ctrl+c杀死,但可以用kill -9杀死。孤儿进程是活着的进程,没有危害
{
perror("fork");
return -1;
}
*/
/守护(幽灵)进程
//守护进程是脱离于终端控制,并且运行在后端的进程
//守护进程不会将信息显示在任何终端上,不会影响前端的操作,也不会被终端产生的任何信息打断,比附:strl+c
//守护进程独立于控制终端,会周期性执行某个任务(运行在死循环)
//守护进程用于与操作系统启动相关的进程,大多数服务器都是用守护进程实现
if(0==cpid)
{
//创建新的会话组;
setsid();
//修改孤儿进程的运行目录为不可卸载的文件系统
chdir("/bin");
//重设文件权限掩码,守护进程一般保留文件原有权限
umask(0002); //不是必要的步骤,可以不设置
//关闭所有父进程继承过来的文件描述符;需要使用的时候重新open
for(int i=0;i<getdtablesize();i++)
{
close(i);
}
//创建守护进程的步骤:
// 1.创建孤儿进程
// 2.创建新的会话,使子进程完全独立;setsid函数
// 3.修改孤儿进程的运行目录为不可卸载的文件系统;chdir函数
// 4.重设文件权限掩码;
// 关闭所有从父进程继承过来的文件描述符,等要使用的时候在重新打开
///结束///
while(1)
{
sleep(1);
}
}
else if(cpid >0)
{
printf("this is parent!!!\n");
}
else
{
perror("fork");
return -1;
}
return 0;
}