上一页 1 ··· 26 27 28 29 30 31 32 33 34 ··· 59 下一页
摘要: ISO C定义了system函数,但是其操作对系统的依赖性很强。POSIX.1包括了system接口,它扩展了ISO C定义,以描述system在POSIX.1环境中的运行行为。 #include int system( const char *cmdstring );如果cmdstring是一个空指针,则仅当命令处理程序可用时,system返回非0值,这一特征可以确定在一个给定的操作系统... 阅读全文
posted @ 2014-01-09 15:30 ITtecman 阅读(2848) 评论(0) 推荐(0) 编辑
摘要: 所有现今的UNIX系统都支持解释器文件(interpreter file)(也可称为解释器脚本)。这种文件是文本文件,其起始行格式是:#! pathname [optional-argument]感叹号和pathname之间的空格是可选的。最常见的解释器文件以下列行开始:#!/bin/shpathname通常是绝对路径名,对它不进行什么特殊的处理(即不使用PATH进行路径搜索)。对这种文件的识别是由内核作为exec系统调用处理的一部分来完成的。内核调用exec函数的进程实际执行的并不是该解释器文件,而是该解释器文件第一行中pathname所指定的文件。一定要将解释器文件(文本文件,它以#!开头 阅读全文
posted @ 2014-01-09 10:33 ITtecman 阅读(1163) 评论(0) 推荐(0) 编辑
摘要: 在UNIX系统中,特权(例如能改变当前日期的表示法以及访问控制(例如,能否读、写一特定文件))是基于用户ID和组ID的。当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户ID或组ID,使得新ID具有合适的特权或访问权限。与此类似,当程序需要降低其特权或阻止对某些资源的访问时,也需要更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。 一般而言,在设计... 阅读全文
posted @ 2014-01-08 19:18 ITtecman 阅读(1133) 评论(0) 推荐(0) 编辑
摘要: 用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。 有6种不同的exec函数可供使用,它们常常被统称为exec函数。这些exec函数使得UNIX... 阅读全文
posted @ 2014-01-08 16:00 ITtecman 阅读(12265) 评论(0) 推荐(0) 编辑
摘要: 当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,则我们认为这发生了竞争条件(race condition)。如果在fork之后的某种逻辑显式或隐式地依赖于在fork之后是父进程先运行还是子进程先运行,那么fork函数就会是竞争条件活跃的滋生地。通常,我们不能预料哪一个进程先运行。即使知道哪一个进程先运行,那么在该进程开始运行后,所发生的事情也依赖于系统负载以及内核的调度算法。如果一个进程希望等待一个子进程终止,则它必须调用一种wait函数。如果一个进程要等待其父进程终止,则可使用下列形式的循环:while ( getppid() != 1 ) sleep( ... 阅读全文
posted @ 2014-01-08 11:19 ITtecman 阅读(2358) 评论(0) 推荐(2) 编辑
摘要: 大多数UNIX系统实现提供了另外两个函数wait3和wait4。它们提供的功能比POSIX.1函数wait、waitpid和waitid所提供的功能要多一个,这与附加参数rusage有关。该参数要求内核返回由终止进程及其所有子进程使用的资源汇总。 #include #include #include #include pid_t wait3( int *statloc, int optio... 阅读全文
posted @ 2014-01-08 10:11 ITtecman 阅读(1117) 评论(0) 推荐(0) 编辑
摘要: Single UNIX Specification的XSI扩展包括了另一个取进程终止状态的函数——waitid,此函数类似于waitpid,但提供了更多的灵活性。 #include int waitid( idtype_t idtype, id_t id, siginfo_t *infop, int options );返回值:若成功则返回0,若出错则返回-1与waitpid相似,wait... 阅读全文
posted @ 2014-01-08 09:56 ITtecman 阅读(2271) 评论(0) 推荐(0) 编辑
摘要: 当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数(信号处理程序)。对于这种信号的系统默认动作是忽略它)。 调用wait或waitpid的进程可能会发生的情况: 如果其所有子进程都还在运行,则阻塞。... 阅读全文
posted @ 2014-01-08 09:39 ITtecman 阅读(3233) 评论(0) 推荐(0) 编辑
摘要: 进程有下面5种正常终止方式:(1)在main函数内执行return语句。这等效于调用exit。(2)调用exit函数。此函数有ISO C定义,其操作包括调用各终止处理程序(终止处理程序在调用atexit函数时登记),然后关闭所有标准I/O流等。(3)调用_exit或_Exit函数。ISO C定义_Exit,其目的是为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法。对标准I/O流是否进行冲洗,这取决于实现。在UNIX系统中,_Exit和_exit是同义的,并不清洗标准I/O流。_exit函数由exit调用,它处理UNIX特定的细节。在大多数UNIX系统实现中,exit(3)是标准C库 阅读全文
posted @ 2014-01-07 21:45 ITtecman 阅读(2721) 评论(0) 推荐(0) 编辑
摘要: vfork函数的调用序列和返回值与fork相同,但两者的语义不同。vfork用于创建一个新进程,而新进程的目的是exec一个新程序。vfork和fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),于是也就不会存访该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间中运行。vfork和fork之间的另一个区别是:vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。(如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。)程序清单8-2 vfork函数实例[root 阅读全文
posted @ 2014-01-07 20:56 ITtecman 阅读(785) 评论(0) 推荐(0) 编辑
上一页 1 ··· 26 27 28 29 30 31 32 33 34 ··· 59 下一页