linux 进程控制笔记
进程创建
普通函数调用完成后,最多返回(return)一次,但fork/vfork会返回二次,一次返回给父进程,一次返回给子进程
父进程的返回值为子进程的进程ID,子进程的返回值为0
1.pid_t fork(void)
父子进程共享代码段,fork之后子进程获得父进程数据空间、堆和栈的副本,然后各自独立操作自己的数据,但他们共享文件描述符
2.pid_t vfork(void)
父子进程共享资源不分家;子进程比父进程先运行,子进程结束后再运行父进程,像普通的函数调用一样
进程同步
1.pid_t wait(int *statloc)
由父进程调用,阻塞式等待任一子进程结束
2.pid_t waitpid(pid_t pid, int *statloc, int options)
可以选择等待指定子进程结束,可设置成非阻塞式等待
调用外部程序
1.exec函数家庭
exec函数族不创建新进程,只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆和栈段
特别注意的是exec执行成功时不返回(就是不再执行exec下面的语句),在载入的程序执行完后就退出了
2.int system(char *cmdstring) 系统调用
system适合拿来调用系统内置的命令或shell脚本
进程优先级
1.int nice(int incr)
主动降低使用cpu的频率
2.int getpriority(int which, id_t who)
获取nice值
3.int setpriority(int which, id_t who, int value);
可以为进程、进程组和特定用户的所有进程设置优先级
进程终止
1.正常终止
- 从main返回:return 0,关闭io流等资源文件
- exit:同return 0
- _exit:仅将自身设置成不可运行,由父进程调用wait/waitpid进行资源回收
2.异常终止
- abort:因特殊情况主动终止
- 由一个信号终止:被其它程序kill或运行期间产生错误(越界内存访问/除零等)被系统中止
例子
1.wait/waitpid/fork基本用法
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
pid_t pid;
if((pid=fork()) <0){
perror("fork error");
return -1;
}else if(pid==0){
if(system("ls -l")<0){
puts("system error");
_exit(-1);
}
_exit(0);
}
if(waitpid(pid,NULL,0) != pid)
puts("wait error");
if((pid=fork()) <0){
perror("fork error");
return -1;
}else if(pid==0){
execlp("date","date",(char *)0);
puts("if execlp goes wrong,you will see me!");
_exit(-1);
}
if(wait(NULL)<0)
puts("wait error");
return 0;
}
2.退出状态
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
void pr_exit(int status){
if(WIFEXITED(status))
printf("normal exit, exit status=%d\n",WEXITSTATUS(status));
else if(WIFSIGNALED(status))
printf("abnormal exit, signal number=%d\n",WTERMSIG(status));
else if(WIFSTOPPED(status))
printf("child stoped, signal number=%d\n",WSTOPSIG(status));
else
printf("unknown exit\n");
}
int main(){
pid_t pid;
int status;
//_exit
if((pid=fork())<0){
perror("fork error");
return -1;
}else if(pid==0)
_exit(7);
if(wait(&status) != pid){
perror("wait error");
return -1;
}
pr_exit(status);
//abort
if((pid=fork())<0){
perror("fork error");
return -1;
}else if(pid==0)
abort();
if(wait(&status) != pid){
perror("wait error");
return -1;
}
pr_exit(status);
//divide by 0
if((pid=fork())<0){
perror("fork error");
return -1;
}else if(pid==0)
status /=0;
if(wait(&status) != pid){
perror("wait error");
return -1;
}
pr_exit(status);
return 0;
}
linux 进程控制笔记的更多相关文章
- linux进程学习笔记
学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...
- Linux进程控制(二)
1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h&g ...
- Linux进程控制(一)
1. Linux进程概述 进程是一个程序一次执行的过程,它和程序有本质区别.程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度 ...
- Linux 进程管理 笔记
https://www.ibm.com/developerworks/cn/linux/l-linux-process-management/index.htmlLinux 进程管理剖析 进程可以是短 ...
- Linux - 进程控制 代码(C)
进程控制 代码(C) 本文地址:http://blog.csdn.net/caroline_wendy 输出进程ID.getpid(). 代码: /*By C.L.Wang * Eclipse CDT ...
- linux 进程学习笔记-运行新进程
我们知道,当用fork启动一个新进程以后,新进程会复制父进程的大部份内存空间并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一个程序集中的代码,这就相当于启动了一个新程序. ...
- Linux 进程控制
分享知乎上看到的一句话,共勉: 学习周期分为学习,思考,实践,校正四个阶段,周期越短,学习效率越高. 前面讲的都是操作系统如何管理进程,接下来,看看用户如何进行进程控制. 1.进程创建 先介绍一下函数 ...
- Linux进程控制(三)
1. 进程间打开文件的继承 1.1. 用fork继承打开的文件 fork以后的子进程自动继承了父进程的打开的文件,继承以后,父进程关闭打开的文件不会对子进程造成影响. 示例: #include < ...
- Linux进程控制——exec函数族
原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是 ...
随机推荐
- Android学习笔记⑧——UI组件的学习AdapterView相关2
前面都是用ListView控件来配合Adapter做的一些实例,这次我们来见识一下GridView与Adapter之间的爱恨情仇.... GridView是用于在界面上按行.列分布的方式来显示多个的组 ...
- as3.0 [Embed]标签嵌入外部资源
1.[Embed]嵌入资源 ActionScript代码的顺序非常重要.你必须在声明变量前添加[Embed]元数据标签,而且这个变量的类型会是Class; package { import flash ...
- python用装饰器实现缓存函数执行结果
根据调用的函数名和调用的参数,对函数的结果进行缓存,下次执行的时候就不用重复计算 可以用装饰器来实现 import time import hashlib import pickle cach ...
- ie下使用firebug
https://getfirebug.com/firebuglite/ 是介绍firebug在别的浏览器如何使用 或者在html中引入firebug-lite.js,然后安F12 <script ...
- 自定义View(一)-ViewGroup实现优酷菜单
自定义View的第一个学习案例 ViewGroup是自动以View中比较常用也比较简单的一种方式,通过组合现有的UI控件,绘制出一个全新的View 效果如下: 主类实现如下: package com. ...
- 二维码zxing源码分析(五)精简代码
由于工作的需要,我并不是需要二维码扫描的所有的功能,我只是需要扫一扫,并显示出来图片和url就行,于是我们就要精简代码了,源码已经分析完了,精简起来就方便多了,源码分析请看 二维码zxing源码分析( ...
- 关于DB2 SQL0805N找不到程序包的错误解决办法
DB2在执行SQL语句的时候会使用内部定义的包(package)来保持不同级别的游标的稳定性, 包的名字就是“ULLID.SYSLH2XX“. DB2 里面默认的时候会创建3个这样的包即SYSLH20 ...
- Cisco模拟器使用和静态路由配置
一. 模拟器使用 网络拓扑图 1. 模拟器搭建环境及网络结构 2. 使用ios系统加载并配置 3. 加载3745ios后计算pc值以减小cpu的消耗 4. 然后使用CTRL+]+i得到最大的一个值(如 ...
- (转)IIS7 优化-网站请发并发数
1. 调整IIS 7应用程序池队列长度 由原来的默认1000改为65535. IIS Manager > ApplicationPools > Advanced Settings Queu ...
- flume+kafka (分区实现 默认单分区) (二)
这篇文章主要在上一篇文章的基础上讲一下 如何自定义flume到kafka的分区 上一节中从下面的地址下载了一个源码 https://github.com/beyondj2ee/flumeng-kafk ...