fork();
僵死进程: 父进程没有等待子进程,wait() 子进程会变成僵死进程。
int main(int arg, char *args[])
{
pid_t pid = fork();//调用fork产生一个子进行
int status;
if (pid == -1)
{
printf("fork failed\n");
return 0;
}
if (pid == 0)//子进程调用execve,执行ls -l命令
{
exit(0);//子进程退出了,变成了僵死进程。
}
else
{
printf("father exit");
//wait(&status);//阻塞调用,直到子进程退出,wait才返回
sleep(10);//没有等待子进程状态。
return 0;//父进程退出
}
}
孤儿进程: 父进程退出子进程还没有退出,会由init进程接管变成孤儿进程。
int main(int arg, char *args[])
{
close(STDOUT_FILENO);//关闭标准输出
open("/dev/pts/2", O_WRONLY);//打开"/dev/pts/2",做为标准输出
pid_t pid = fork();//调用fork产生一个子进行
int status;
if (pid == -1)
{
printf("fork failed\n");
return 0;
}
if (pid == 0)//子进程调用execve,执行ls -l命令
{
char *args[] = { "/bin/ls", "-l", NULL };
execve("/bin/ls", args, NULL);
}
else
{
return 0;//父进程退出
}
}
//父进程等待子进程退出的代码
int main(int arg, char *args[])
{
pid_t pid = fork();//调用fork之后会有两个进程
int status;
if (pid == 0)
{
printf("child begin\n");
sleep(5);
printf("child end\n");
return -1;
}
if (pid > 0)
{
printf("parent begin\n");
wait(&status);//阻塞调用,直到子进程退出,wait才返回
printf("child return = %d\n", WEXITSTATUS(status));
printf("parent end\n");
}
return 0;
}
//僵死进程
//父进程没有调用wait,子进程就退出了,这个时候子进程就成了僵死进程
进程退出的5种方式:
return 跟exit 在主函数main中效果是一样的,只是在子函数中,才有区别,子函数中return只是退出子函数,exit才是退出进程。
exit 在main函数中跟return是一样的,只是在子函数中不相同。
_exit
abort 异常退出。生成一个core.xxx文件 (ulimit -c unlimited)
信号 kill(pid , SIGKILL);
fork();的更多相关文章
- [置顶] Linux高编之进程--------fork函数的同步与异步(兄弟子进程和父子孙进程示列)
前面讲述的fork函数的基本用法,下面通过两个程序来说明fork函数同步与异步之间的关系: <1>通过fork函数实现在父进程下的四个兄弟子进程(即异步) : 函数实现代码: #inclu ...
- 关于操作系统中多个fork()会创建几个进程的理解
最近在看操作系统的书,在讲到用fork()创建子进程时,有些地方一时迷惑,最终理解,特记录下来.如下: //创建一个子进程:#include "csapp.h" int main( ...
- Github fork其他项目的分支与主干保持同步
Fork一个Repo Fork是一个复制的操作,当你Fork一个项目之后,你就有了在原项目的基础之上进行修改和扩展的权限. 通常情况下,Fork操作用于参与别人的项目(成为项目中的一员),或者以别人的 ...
- 多进程 multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;
multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ...
- Redis时延问题分析及应对
Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞: 当redis的数据量达到一定级别后(比如 ...
- Linux内核分析总结
张潇月 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习目录: (1)计算机是如何工作的 h ...
- 分析Linux内核创建一个新进程的过程
一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct ...
- 《Linux内核分析》第六周 进程的描述与创建
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK SIX(3 ...
- Linux内核分析——第八周学习笔记20135308
第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...
随机推荐
- 编程实例--for循环,找出0~100之间与8有关的正整数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 自己动手写缓存Version1
实现一个最简单最主要的缓存系统. using System; using System.Data; using System.Configuration; using System.Web; usin ...
- Extended ComboBox添加图标
Extended ComboBox添加图标 关键点 实现过程 // MFC02Dlg.h : header fileCImageList m_imageList; // MFC02Dlg.cpp : ...
- MySQL参数优化
目前针对MySQL数据库进行了一些参数优化,具体如下: my.ini / my.cnf 参数说明 #使用查询缓存 query_cache_size=100M # ...
- Android软键盘调用及隐藏,以及获得点击软键盘输入的字母信息
在Android提供的EditText中单击的时候,会自动的弹出软键盘,其实对于软键盘的控制我们可以通过InputMethodManager这个类来实现.我们需要控制软键盘的方式就是两种一个是像Edi ...
- css怎么引用某张图片?链接要怎么写
总结一下 <a href="D:\xxx"> <img src="./xxx.jpg">
- Unity3D 3D坦克大战
视频学习来源 移动和旋转 using UnityEngine; using System.Collections; /* * Adminer:sun2955 * http:www.yinghy.com ...
- Web电子商务网(三层)V2.0源码
Web电子商务网(三层)V2.0源码 源码描述: 一.源码特点 采用三层架构开发,购物车功能 二.功能介绍 前台集成了产品在线展示,用户注册.在线调查.在线投稿 后台有类别管理\图书管理\订单 ...
- 最全的ASP.NET开源CMS汇总
转载:http://www.cnblogs.com/cxd4321/archive/2011/11/16/2250707.html 国内: 1.SiteServer CMS SiteServer CM ...
- Web开发必备资源汇总[转]
导读:原文来自< Best “must know” open sources to build the new Web>,译文由酷壳网陈皓整理编译< 开源中最好的Web开发的资源 & ...