现在的位置: 首页 > 综合 > 正文

exit()_exit()终止进程

2013年05月25日 ⁄ 综合 ⁄ 共 2375字 ⁄ 字号 评论关闭

/*

*  _exit() 立即停止进程,并清理使用空间,及其内核中的各种数据结构

* exit() 执行退出前,调用退出处理函数,清理I/0缓冲

*/

#include <stdio.h> //文件预处理,包含标准输入输出库

#include <unistd.h> //文件预处理,包含fork函数库
#include <sys/types.h> //文件预处理,包含fork函数库
#include <stdlib.h> //文件预处理,包含exit函数库
void terminal_progress()
{
pid_t result; //用于存储fork返回子进程的pid
result = fork(); //调用fork函数,返回值存放在变量result中
if(result==-1) //通过result的值来判断fork函数的返回情况,
{
perror("创建子进程失败!\n");
exit(0);
}
else if(result ==0) //值为0表示子进程
{
printf("测试终止进程的_exit()!\n");
printf("这一行我们用缓存!");
_exit(0);
}
else //返回值大于0表示父进程
{ sleep(10);
printf("测试终止进程exit()!\n");
printf("这一行我们用缓存!");
exit(0);
}

}

/*
*本程序展示如何避免僵尸进程
*/
#include <stdio.h> //文件预处理,包含标准输入输出库
#include <unistd.h> //文件预处理,包含fork函数库
#include <sys/types.h> //文件预处理,包含fork,wait,waitpid函数库
#include <sys/wait.h> //文件预处理,包含wait,waitpid函数库
void zombie_progress()
{
pid_t pid,wpid;
int status,i;
pid = fork(); //调用fork函数复制进程
if(pid==0) //返回值为0表示子进程
{
printf("这是子进程,进程号码(pid)是: %d\n",getpid());
sleep(5); //子进程等待5秒钟
exit (6);
}
else
{
printf("这是父进程,正在等待子进程.....\n");
wpid = wait(&status);//父进程调用 wait函数,消除僵尸进程
i=WEXITSTATUS(status);//通过整形指针status,取得子进程退出//时的状态
printf("等待的进程的进程号是: %d, 结束状态:%d\n",wpid,i);
}
}

#include <stdio.h> //文件预处理,包含标准输入输出函数
#include <unistd.h> //文件预处理, 包含fork函数库
#include <sys/types.h> //文件预处理,包含fork,wait,waitpid函数库
#include <sys/wait.h> //文件预处理,包含wait,waitppid函数库
void display0();
void display1();
void display2();
void cisco()
{
pid_t result;
int status,select ,num;
void(*fun[3])(); //利用函数指针建立三个子程序
fun[0] = display0;
fun[1] = display1;
fun[2] = display2;
printf("1.复制进程\n 2,不复制进程\n 请输入你的选择:");
scanf("%d",&select);
if(select ==1) //如果用户输入1,复制进程
{
result = fork(); //调用fork函数复制进程,返回值存在//变量result 中
if(result==-1)
{
perror("复制进程出错");
exit(1);
}
if(result==0) //子进程
{
printf("这是子进程(进程号: %d,父进程号:%d):",getpid(),getppid());
printf("进入思科(cisco)1912交换机开机界面.\n");
printf("1 user(s) now active on management console.\n");
printf("\t uer interface menu\n");
printf("\t [0] Menu\n");
printf("\t [1] Command Line\n");
printf("\t [2] IP Configuration \n");
printf("Enter Selection:");
scanf("%d",&num); /*运用函数指针,运行相应的了程序*/
if(num>=0&&num<=2)
(*fun[num])();
exit(0);
}
else
{
waitpid(result,&status,WNOHANG);                                                            /*WNOHANG   不会对父进程进程阻塞 */
/*父进程调用waitppid函数,消除僵尸进程*/
printf("这是父进程(进程号:%d,父进程号:%d)\n",getpid(),getppid());
if(WIFEXITED(status)==0)
printf("子进程非正常终止,子进程终止状态:%d\n",WIFEXITED(status));
else
printf("子进程正常终止,子进程终止状态:%d\n",WIFEXITED(status));
exit(0);
}
}
}
void display0()
{
printf("你选择了进入菜单模式\n");
}
void display1()
{
printf("你选择了进入命令行模式\n");
}
void display2()
{
printf("你选择进入ip地址配置模式\n");
}

抱歉!评论已关闭.