<!--[if !supportLists]-->Ÿ <!--[endif]-->等待子进程结束 pid_t waitpid(pid_t pid, int *stat_loc, int options) 另外有一个函数叫wait,其相当于 waitpid(-, &status, ) 大家经常看到的关于waitpid的经典例子是:你下载了某个软件的安装程序A,其在安装即将结束时启动了另外一个流氓软件的安装程序B,当B也安装结束后,其告诉你所有安装成功了.A和B分别在不同的进程…
学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Version (UNIX98) and its predecessor Version (UNIX95), defines a process as “an address spacewith one or more threads executing within that address space, a…
1.什么是程序?什么是进程?它们有什么区别? 定义: 程序:程序(Program)是一个静态的命令集合,程序一般放在磁盘中,然后通过用户的执行来触发.触发后程序会加载到内存中成为一个个体,就是进程. 进程:进程(Process)的一个比较正式的定义是[在自身的虚拟地址空间运行的一个单独的程序.] [个人理解:进程的本质是一个被加载到内存中并获得系统资源使之运行的程序实例] 区别: 程序通常是一个二进制文件,不占用系统的运行资源. 进程是一个随时都可能发生变化的.动态的.使用系统运行资源的程序.而…
进程跟踪 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Linux用ptrace来进行进程跟踪,就跟我们平时用GDB debug一样,它允许一个进程去跟踪和控制另外一个进程.当被跟踪进程有信号发生时,被跟踪进程会被暂停下来,其内存空间变得可读写,跟踪它的进程可以选择是否忽略该信号和让程序继续进行.被跟踪进程无论是进行系统调用还是从系统调用返回时,跟踪它的进程都可以来处理该系统调用,比如…
在分时系统中,系统将CPU时间划分成无数个时间片(quantum)分配给不同的进程,一个时间片只执行一个进程,并且不停地切换,以让用户感觉到各个进程是在“同时运行”,这中间所需要的策略和算法便是进程调度. 一个很好的例子是:假设目前系统只运行了两个进程,一个解压缩程序和一个文本编辑器.由于解压缩程序会大量地占用CPU而不是I/O设备(将解压后的文件写入磁盘),所以对解压缩程序而言CPU是其最大的影响因素,我们将这类程序归类为“CPU-Bound(CPU限制型)”.与之相对应的,文本编辑器对CPU…
task_struct的state字段记录的进程的状态,可分为如下几种: #define TASK_RUNNING 0 可运行状态.这是 “进程正在被CPU运行” 和 “进程正在可运行队列中等待被CPU运行” 统称.也可以将它们拆开成“RUNNING”和“READY”两种状态. #define TASK_INTERRUPTIBLE 1 可中断的睡眠状态.当进程等待某个条件(比如某个资源,中断,信号)而被挂起时就处于该状态,当条件得到满足时,进程将会重新返回到TASK_RUNNING状态. #de…
信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可以选择忽略该信号或者采用系统默认的处理方式). 我看可以通过“kill -l”命令来查看系统支持的信号,比如SIGKILL它表示需要终止一个进程,它有一个系统特定的信号值9.这些值都定义在signal.h中 在signal.h中有个叫做_NSIG(一般为64)的宏其表示该系统支持的最多信号数,而SI…
信号灯(信号量)不是进程通信手段,其是用于控制和协调在进程间通信过程中的共享资源访问,就如同互斥锁(两者的区别可以参考这里) 可以将简单地将信号灯想象成一个计数器,初始时计数器值为n(有n个资源可供使用),当进程占用资源时计数器减1,资源被释放时计数器加1,没有资源可用时计数器为0. 如果资源只用“可用/不可用”这样的非是即否的状态的话,信号灯称为二值信号灯(binary semaphre),相反地,称为计数信号灯(counting semaphores) 将信号灯的原理表示成代码的话,则非常简…
PID,进程号 , 范围在2~(??为什么需要这么多),而一个名为idle (或swapper)的进程占据的编号0,init进程占据了编号1. 进程0和进程1 : 系统启动时会从无到有地创建进程0,它是所有其它进程的祖先.进程0最终会创建进程1,也就是init,它是Unix系统内核初始化与用户态初始化的接合点,它是其它用户process的祖宗.在运行init以前是内核态初始化,该过程(内核初始化)的最后一个动作就是运行/sbin/init可执行文件.从init process运行开始进入Unix…
我们知道,当用fork启动一个新进程以后,新进程会复制父进程的大部份内存空间并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一个程序集中的代码,这就相当于启动了一个新程序. 所以,要运行一个新程序,需要最基本的两步: Ÿ 创建一个可运行程序的环境,也就是进程. Ÿ 将环境中的内容替换成你所希望的,也就是用你希望运行的可执行文件去覆盖新进程中的原有映像,并从该可执行文件的起始处开始执行. 要做到第一点,非常简单,fork函数就可以:而要做到第二点,则可以利用exec函数…