#UNIX环境高级编程第三版

高级I/O之记录锁

若两个人同时编辑一个文件,其后果将如何呢?在很多UNIX系统中,该文件的最后状态取决于写该文件的最后一个进程。但是对于有些应用程序(例如数据库),进程有时需要确保它正在单独写一个文件。为了向进程提供这种功能,商用UNIX系统提供了记录锁机制。记录锁(recordlocking)的功能是:当一个进程正在读或修改文件的某个...
代码星球 ·2021-02-21

高级I/O之非阻塞I/O

http://www.cnblogs.com/nufangrensheng/p/3515035.html中曾将系统调用分成“低速”系统调用和其他系统调用两类。低速系统调用是可能会使进程永远阻塞的一类系统调用,它们包括下列调用:如果某些文件类型(例如管道、终端设备和网络设备)的数据并不存在,则读操作可能会使调用者永远阻塞...
代码星球 ·2021-02-21

守护进程之编程规则

在编写守护进程时需遵循一些基本规则,以便防止产生并不需要的交互作用。下面先说明这些规则,然后给出一个按照这些规则编写的函数daemonize。(1)首先要做的是调用umask将文件模式创建屏蔽字设置为0。由继承得来的文件模式创建屏蔽字可能会拒绝设置某些权限。例如,若守护进程要创建一个组可读、写的文件,而继承的文件模式创...
代码星球 ·2021-02-21

进程环境之getrlimit和setrlimit函数

每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改。#include<sys/resource.h>intgetrlimit(intresource,structrlimit*rlptr);intsetrlimit(intresource,conststructrl...

进程环境之setjmp和longjmp函数

在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp。这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的。setjmp和longjmp函数也称为非局部goto,非局部指的是,这不是由普通C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函...

进程环境之环境变量

环境字符串的形式通常如下:name=valueUNIX内核并不查看这些字符串,它们的解释完全取决于各个应用程序。ISOC定义了一个函数getenv,可以用于取环境变量值,但是该标准又称环境变量的内容是由实现定义的。#include<stdlib.h>char*getenv(constchar*name);返...
代码星球 ·2021-02-21

进程环境之存储器分配

ISOC说明了三个用于存储器空间动态分配的函数:(1)malloc。分配指定字节数的存储区。此存储区中的初始值不确定。(2)calloc。为指定数量具有指定长度的对象分配存储空间。该空间中的每一位都初始化为0。(3)realloc。更改以前分配区的长度(增加或减少)。当增加长度时,可能需要将以前分配区的内容移到另一个足...

进程环境之共享库以及如何区分静态库、共享库和动态加载库

现在,大多数UNIX系统支持共享库。共享库使得可执行文件中不再需要包含公用的库例程,而只需在所有进程都可引用的存储区中维护这种库例程的一个副本。程序第一次执行或者第一次调用某个库函数时,用动态链接方法将程序与共享库函数相链接。这减少了每个可执行文件的长度,但增加了一些运行时间开销。这种时间开销发生在该程序第一次被执行时...

进程环境之C程序的存储空间布局

从历史上讲,C程序一直由下面几部分组成:正文段。这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外而修改其自身的指令。初始化数据段。(所有带有初始值的全局变量)通常将此段称为数据...

进程环境之环境表

每个程序都会接收到一张环境表。与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的C字符串的地址。全局变量environ则包含了该指针数组的地址:externchar**environ;要在程序中使用全局变量environ时,需要用该语句作变量声明。extern指示environ在其他文件中已...
代码星球 ·2021-02-21

进程环境之命令行参数

当执行一个程序时,调用exec的进程可将命令行参数传递给该新进程。这是UNIXshell的一部分常规操作。程序清单7-3将所有命令行参数回送到标准输出[root@localhostapue]#catprog7-3.c#include"apue.h"intmain(intargc,char*argv[]){inti;fo...

进程环境之进程终止

有8种方式使进程终止(termination),其中5种为正常终止,它们是:(1)从main返回。(2)调用exit。(3)调用_exit或_Exit。(4)最后一个线程从其启动例程返回。(5)最后一个线程调用pthread_exit。异常终止有3种方式,它们是:(6)调用abort。(7)接到一个信号并终止。(8)最...
代码星球 ·2021-02-21

进程环境之main函数

C程序总是从main函数开始执行。main函数的原型是:intmain(intargc,char*argv[]);其中,argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组。当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地...
代码星球 ·2021-02-21

实用编程技术之多个头文件中变量的重复定义

一些基本系统数据类型可以在多个头文件中定义。例如,在FreeBSD5.2.1中,size_t在26个不同的头文件中都有定义。由于一个程序可能包含这26个不同的头文件,并且ISOC不允许对同一个名字进行多次类型定义,那么我们该如何编写这些头文件呢?下面是FreeBSD中使用的技术:首先,在头文件<machine/_...

UNIX标准化及实现之标准之间的冲突

就整体而言,这些不同的标准之间配合得相当好。但是我们也很关注它们之间的差别,特别是ISOC标准和POSIX.1之间的差别。ISOC定义了函数clock,它返回进程使用的CPU时间,返回值类型是clock_t。为了将此值变换成以秒为单位,将其除以在<time.h>头文件中定义的CLOCKS_PER_SEC。P...
首页上一页...1415161718...下一页尾页