摘要: 进程有下面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) 编辑
摘要: 一个现有进程可以调用fork函数创建一个新进程。#include pid_t fork( void );返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID。fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID(进程 阅读全文
posted @ 2014-01-07 20:14 ITtecman 阅读(5373) 评论(0) 推荐(0) 编辑
摘要: 每个进程都有一个非负整型表示的唯一进程ID。因为进程ID标识符总是唯一的,常将其用作其他标识符的一部分以保证其唯一性。例如,应用程序有时就把进程ID作为名字的一部分来创建一个唯一的文件名。 虽然是唯一的,但是进程ID可以重用。当一个进程终止后,其进程ID就可以再次使用了。大多数UNIX系统实现延迟重用算法,使得赋予新建进程的ID不同于最近终止进程所使用的ID。这防止了将新进程误认为是使用同一ID... 阅读全文
posted @ 2014-01-07 17:58 ITtecman 阅读(2900) 评论(0) 推荐(0) 编辑
摘要: 每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改。 #include int getrlimit( int resource, struct rlimit *rlptr );int setrlimit( int resource, const struct rlimit *rlptr );两个函数返回值:若成功则返回0,若出错则返回非0值进程的资... 阅读全文
posted @ 2014-01-07 17:15 ITtecman 阅读(10691) 评论(0) 推荐(1) 编辑
摘要: 在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp。这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的。 setjmp和longjmp函数也称为非局部goto,非局部指的是,这不是由普通C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一函数中。 #include int setjmp(... 阅读全文
posted @ 2014-01-07 15:44 ITtecman 阅读(677) 评论(0) 推荐(0) 编辑
摘要: 环境字符串的形式通常如下: name=value UNIX内核并不查看这些字符串,它们的解释完全取决于各个应用程序。 ISO C定义了一个函数getenv,可以用于取环境变量值,但是该标准又称环境变量的内容是由实现定义的。 #include char *getenv( const char *name );返回值:指向与name关联的value的指针,若未找到则返回NULL注意,... 阅读全文
posted @ 2014-01-07 10:25 ITtecman 阅读(2254) 评论(0) 推荐(0) 编辑
摘要: ISO C说明了三个用于存储器空间动态分配的函数: (1)malloc。分配指定字节数的存储区。此存储区中的初始值不确定。 (2)calloc。为指定数量具有指定长度的对象分配存储空间。该空间中的每一位都初始化为0。 (3)realloc。更改以前分配区的长度(增加或减少)。当增加长度时,可能需要将以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区(此时,返回新分配区的指针,... 阅读全文
posted @ 2014-01-07 10:04 ITtecman 阅读(364) 评论(0) 推荐(0) 编辑
摘要: 现在,大多数UNIX系统支持共享库。共享库使得可执行文件中不再需要包含公用的库例程,而只需在所有进程都可引用的存储区中维护这种库例程的一个副本。程序第一次执行或者第一次调用某个库函数时,用动态链接方法将程序与共享库函数相链接。这减少了每个可执行文件的长度,但增加了一些运行时间开销。这种时间开销发生在该程序第一次被执行时,或者每个共享库函数第一次被调用时。共享库的另一个优点是可以用库函数的新版本替代老版本,而无需对使用该库的程序重新连接编辑。(假定参数的数目和类型都没有发生改变。)在不同的系统中,程序可能使用不同的方法说明是否要使用共享库。比较典型的有cc(1)和ld(1)命令的选项。作为长度方 阅读全文
posted @ 2014-01-07 09:13 ITtecman 阅读(898) 评论(0) 推荐(0) 编辑
摘要: 从历史上讲,C程序一直由下面几部分组成:正文段。这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外而修改其自身的指令。初始化数据段。(所有带有初始值的全局变量)通常将此段称为数据段,它包含了程序中需明确地赋初值的变量。例如,C程序中出现在任何函数之外的声明:int maxcount = 99;使此变量带有其初值存放在初始化数据段中。非初始化数据段。(所有未带初始值的全局变量)通常将此段称为bss段,这一名称来源于一个早期的汇编运算符,意思是“block 阅读全文
posted @ 2014-01-07 09:00 ITtecman 阅读(942) 评论(0) 推荐(0) 编辑