第8节 进程操作.ppt

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
运行某个程序 0号进程:当内核系统完成自身初始化工作后,由内核本身调用函数kernel_thread(),使用int 0x80系统调用创建第一个内核线程。 1号内核线程:内核线程直接使用物理地址空间,运行在内核态中。在int 0x80软中断系统调用返回后,通过比较ESP和ESI寄存器的值来判断父子关系。如果ESP寄存器的值就等于ESI寄存器的值,系统认为是父进程,就是内核本身,它就是0号进程。否则就是内核创建的第一个内核线程。所以此线程就是1号线程。 1号内核进程:如果是1号内核线程,程序控制该子程序直接去执行init()函数,随后,1号线程将演变成1号内核进程。 init进程:init()函数调用execve()从文件/etc/inittab中装入可执行程序init()并执行,从此执行init()函数的1 号内核进程演变成为init进程。也就是说由init()函数产生了init进程。在这个演变过程中没有使用fork(),因此,init进程的进程标识符仍然是1号内核进程的标识符1。 在Linux中,通过调用fork系统调用来创建一个新的进程。新创建的子进程同样也能执行fork,所以,有可能形成一颗完整的进程树。注意,每个进程只有一个父进程,但可以有0个、1个、2个或多个子进程。 作为进程树如何使用的一个简单例子,让我们来看Linux启动时是怎样对其自己进行初始化的。Linux在启动时就创建一个称为init的特殊进程,其进程标识符PID为1,它是用户态下所有进程的祖先进程,以后诞生的所有进程都是它的子进程——或是它的儿子,或是它的孙子。1号进程运行时查询系统当前存在的终端数,然后为每个终端创建一个新的管理进程,这些进程在终端上等待着用户的登录。当用户正确登录后,系统再为每一个用户启动一个shell进程,由shell进程等待并接受用户输入的命令信息,如图3.1是一颗进程树。此外,init进程还负责管理系统中的“孤儿”进程。如果某个进程创建子进程之后就终止,而子进程还“活着”,则子进程成为孤儿进程。init进程负责“收养”该进程,即孤儿进程会立即成为init进程的子进程。这是为了保持进程树的完整性。 信号量操作的函数 semget int semget(key_t key, int nsems, int semflg); 创建、打开一个已创建的信号量集 key 创建或打开队列的键值,常采用IPC_PRIVATE nsems 信号量个数,通常为1; semflg 函数操作标识位,包含操作权限和本函数动作(通常是0666|IPC_CREAT),即若不存在key值的队列则创建,否则打开,0666表示与一般文件权限一样 函数执行成功会返回信号量的ID,否则返回-1; 1.semget int semget(key_t key, int nsems, int semflg); 创建、打开一个已创建的信号量集 key 常采用IPC_PRIVATE,这样会由系统分配信号量编号; nsems 信号量个数,通常为1; semflg 函数操作标识位,包含操作权限和本函数动作(通常是0666|IPC_CREAT) 函数执行成功会返回信号量的ID,否则返回-1; 2.semop int semop(int semid, struct sembuf *sops, unsign ednsops); 对指定的信号量进行指定的操作 struct sembuf { ushort sem_num; short sem_op; short sem_flg; }; 3.semctl int semctl(int semid, int semnum, int cmd, ...); 对指定的信号量进行控制操作 cmd的常用可取值(非完全)如下: IPC_STAT 读取信号量的状态信息,返回到arg的buf元素中。 IPC_RMID 删除指定的信号量(集)。 GETPID 返回最后一个执行semop函数的进程的进程号。 GETVAL 返回信号量的值。 SETVAL 设置信号量的值,取自arg的val元素。 semop int semop(int semid, struct sembuf *sops, unsigned nsops); 执行成功返回0,否则返回-1 对指定的信号量进行指定的操作 ,增加或减少信号量值,对应于共享资源的释放和占有 semid是信号量集的id,参数sop指向类型为sembuf的一个数组,参数nsops是sops指向数组的大小 struct sembuf { ushort sem_num;//在数组中信号量的索引值 short sem_op;//负数表示P操作,正

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档