unix环境高级编程-进程环境(2)
2016-07-29 17:55
260 查看
函数getrlimit和setrlimit:每个进程都有一组资源限制,可以用这两个函数查看修改。
在更改资源限制时要注意:
1.任何进程都可将一个软限制值更改为小于或等于其硬限制值
2.任何进程都可降低其硬限制值,但必须大于等于其软限制值
3.只有超级用户可以提高硬限制值
两个函数的resource参数取下列值之一:
每个进程都有一个非负整型表示的唯一进程ID,系统有一些专用进程,ID为0的进程通常是调度进程,常被称为交换进程,是内核的一部分。进程ID1通常是init进程,此进程负责在自举内核后启动第一个unix系统。init进程不会终止。
函数fork:
一个现有的进程可以调用fork函数创建一个新进程。
由fork创建的新进程称为子进程,子程序是父进程的副本,获得父进程的数据空间,堆和栈的副本。父和子进程并不共享这些存储空间。
下列程序演示了fork函数,可以看出子进程对变量做的改变并不影响进程中变量的值。
一般而言,在fork之后是父进程先执行还是子进程先执行是不确定的,取决于内核的调度算法,在上程序中,父进程休眠2s,让子进程先执行。
vfork函数:
调用序列和返回值与fork相同,但两者的语义不同。vfork用于创建一个新进程,而该进程的目的是exec一个新程序,与fork的区别在于,vfork不会将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec,于是也就不会引用该地址空间。还有一个区别就是,vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。
函数exit:
之前提过了集中正常终止和异常终止进程的方式,对于任意一种,都希望能够通知父进程是如何终止的,对于正常终止的,将其退出状态作为参数传送给函数,异常终止的,内核产生一个指示原因的终止状态。在fork函数可知道,子进程是父进程调用fork产生的,如果父进程在子进程之前终止,这些子进程的父进程都改变成为init进程,称这些进程由init进程收养。
如果子进程在父进程之前终止,父进程如何得到子进程的终止状态?内核为每个终止子进程保存了信息,当父进程调用wait或waitpid时,可以得到这些信息,如果一个已经终止,但父进程未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的内存)的进程被称为僵死进程(zombie)
被init进程收养的子进程终止会怎么样?init是无论何时只要有一个子进程终止,init就会调用一个wait函数取得其终止状态,这样就防止了在系统中塞满僵死进程。
函数wait和waitpid:
当一个进程正常或异常终止时,内核向父进程发送sigchld信号,父进程可以选择忽略该信号,或者提供给一个该信号发生即被调用执行的函数。
如果调用wait/waitpid进程会发生什么?
如果其所有进程都还在运行,则阻塞
如果一个子进程已终止,正等待父进程获取其终止状态,则取得终止状态立即返回。
如果没有任何子进程,立即出错返回。
两个函数的区别如下:
在一个子进程终止前,wait使其调用者阻塞,而waitpid有一选项,可使调用者不阻塞
waitpid并不等待在其调用后的第一个终止子进程,它有若干选项,可以控制它所等待的进程。
函数wait3和wait4
这两个函数提供的功能更多,这与附加参数有关。该参数允许内核返回由终止进程及其所有子进程使用的资源概况。
竞争条件:
当多个进程都企图对共享数据进行某种处理时,而最后的结果又取决于进程运行的顺序时。就发生了竞争条件。
函数exec:当用fork创建新的子进程时,子进程往往要调用exec函数以执行另一个进程,当进程调用exec时,该进程执行的程序完全替代为新程序,而新程序从main函数开始执行。
在更改资源限制时要注意:
1.任何进程都可将一个软限制值更改为小于或等于其硬限制值
2.任何进程都可降低其硬限制值,但必须大于等于其软限制值
3.只有超级用户可以提高硬限制值
两个函数的resource参数取下列值之一:
每个进程都有一个非负整型表示的唯一进程ID,系统有一些专用进程,ID为0的进程通常是调度进程,常被称为交换进程,是内核的一部分。进程ID1通常是init进程,此进程负责在自举内核后启动第一个unix系统。init进程不会终止。
函数fork:
一个现有的进程可以调用fork函数创建一个新进程。
由fork创建的新进程称为子进程,子程序是父进程的副本,获得父进程的数据空间,堆和栈的副本。父和子进程并不共享这些存储空间。
下列程序演示了fork函数,可以看出子进程对变量做的改变并不影响进程中变量的值。
#include "apue.h" int globvar =6; char buf[]="a write to stdout\n"; int main() { int var; pid_t pid; var = 88; if(write(STDOUT_FILENO, buf ,sizeof(buf)-1) !=sizeof(buf)-1) err_sys("write error"); printf("before fork\n"); if((pid=fork())<0) { err_sys("fork error"); } else if(pid == 0) //子进程 { globvar++; var++; } else //父进程 { sleep(2); } printf("pid = %ld , glob =%d, var =%d\n",(long)getpid(),globvar,var); exit(0); }
一般而言,在fork之后是父进程先执行还是子进程先执行是不确定的,取决于内核的调度算法,在上程序中,父进程休眠2s,让子进程先执行。
vfork函数:
调用序列和返回值与fork相同,但两者的语义不同。vfork用于创建一个新进程,而该进程的目的是exec一个新程序,与fork的区别在于,vfork不会将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec,于是也就不会引用该地址空间。还有一个区别就是,vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。
函数exit:
之前提过了集中正常终止和异常终止进程的方式,对于任意一种,都希望能够通知父进程是如何终止的,对于正常终止的,将其退出状态作为参数传送给函数,异常终止的,内核产生一个指示原因的终止状态。在fork函数可知道,子进程是父进程调用fork产生的,如果父进程在子进程之前终止,这些子进程的父进程都改变成为init进程,称这些进程由init进程收养。
如果子进程在父进程之前终止,父进程如何得到子进程的终止状态?内核为每个终止子进程保存了信息,当父进程调用wait或waitpid时,可以得到这些信息,如果一个已经终止,但父进程未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的内存)的进程被称为僵死进程(zombie)
被init进程收养的子进程终止会怎么样?init是无论何时只要有一个子进程终止,init就会调用一个wait函数取得其终止状态,这样就防止了在系统中塞满僵死进程。
函数wait和waitpid:
当一个进程正常或异常终止时,内核向父进程发送sigchld信号,父进程可以选择忽略该信号,或者提供给一个该信号发生即被调用执行的函数。
如果调用wait/waitpid进程会发生什么?
如果其所有进程都还在运行,则阻塞
如果一个子进程已终止,正等待父进程获取其终止状态,则取得终止状态立即返回。
如果没有任何子进程,立即出错返回。
两个函数的区别如下:
在一个子进程终止前,wait使其调用者阻塞,而waitpid有一选项,可使调用者不阻塞
waitpid并不等待在其调用后的第一个终止子进程,它有若干选项,可以控制它所等待的进程。
函数wait3和wait4
这两个函数提供的功能更多,这与附加参数有关。该参数允许内核返回由终止进程及其所有子进程使用的资源概况。
竞争条件:
当多个进程都企图对共享数据进行某种处理时,而最后的结果又取决于进程运行的顺序时。就发生了竞争条件。
函数exec:当用fork创建新的子进程时,子进程往往要调用exec函数以执行另一个进程,当进程调用exec时,该进程执行的程序完全替代为新程序,而新程序从main函数开始执行。
相关文章推荐
- (14)SSH中BaseDao实现
- Java数据类型转换
- Log4Qt
- JAVASE总结--08(封装、继承、多态)
- Python中self的含义
- Java变量
- Java静态与同步
- hdu-1018Big Number(阶乘求位数)
- java-基础-强、软、弱、虚引用
- eclipse安装jetty插件、maven项目测试
- springMVC 配置过程,及问题处理
- Python NumPy入门归纳~持续更新
- 【图形学与游戏编程】开发笔记-基础篇2:DX11初始化
- 32位与64位下各类型长度对比
- Spring(四) Spring容器(2)
- 免费电子面单接口-Java接入
- Python 实战之列表(list)实战详解
- java图像处理--形态学填充处理imfill
- ContentProvider 和ContentResolver内容提供者和内容解析者
- 如何下载旧版本的Java