您的位置:首页 > 运维架构 > Linux

Linux 孤儿、僵尸、服务进程创建

2017-01-25 19:57 567 查看
#include"func.h"
// 头文件
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<limits.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<string.h>
#include<sys/select.h>
#include<sys/time.h>
#include<sys/mman.h>
#include<sys/wait.h>


// orphan进程

int main(){

if(!fork())
{
printf("I am orphan\n");
while(1);
}
else{
exit(3);
}
return 0;
}


// zombie 进程
#include"func.h"
/*子进程先退出,而父进程并没有回收资源,造成僵尸进程*/
int main(){

if(!fork())
{
exit(2);
}
else{
while(1);
}
}

#include"func.h"
/*3、通过fork创建子进程,然后父进程通过wait回收,同时拿到子进程的返回值*/

/*为了避免产生僵尸进程,消耗系统资源,当子进程退出时,要使用
* wait() 及时回收资源*/

/*可以使用 pid_t wait(int *status);来查看子进程退出时的返回值,
* 使用宏实现,WIFEXITED(status),正常结束,输出非0,确定是否正常退出,
* staturs 传入整型值,非地址
* WEXITSTATUS(status)查看进程退出值*/

int main()
{
pid_t pid;
pid = fork();
if(pid ==0) // 子进程创建
{
exit(2);
}else{    // 父进程创建
// wait(NULL); // wait()要在sleep()之前调用,否则一样会造成僵尸进程
int status;
pid_t cpid;
cpid=wait(&status); // 传入整型值,非地址
if(WIFEXITED(status)){// 子进程正常退出
printf("child pid return %d\n",WEXITSTATUS(status));
printf("cpid %d\n",cpid);
sleep(10);

}else{ // 非正常退出
printf("child crach\n");
}

}

}

/*4、创建deamon并运行*/
#include"func.h"

int main(){

pid_t pid,sid;
const int MAXFD=3;
pid =fork();
if(pid<0){
exit(1);
}

if(pid>0){
exit(0);
}

sid=setsid(); // 成为新进程领导,脱离控制终端
if(sid<0){
// return failure
exit(1);
}

chdir("/"); // 设置目录为根目录
for(int i=0;i<MAXFD;i++){
close(i);
}
while(1);
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: