episode专题提供episode的最新资讯内容,帮你更好的了解episode。
趁着在家里,开始学习APUE(Unix环境高级编程)第三版。 首先是下载源代码,在Ubuntu下,直接输入 make 提示缺少一个lbsd的东西,输入: sudo apt install libbsd-dev 然后写了第一个示例程序,关于ls的。 接着在lib下找到了libapue.a 于是输入: gcc -o a.out ls.c ../lib/libapue.a -I../include 或者
文件描述符 文件描述符(file descriptor)通常是一个小的非负整数,内核用一个标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一个新文件时,它都返回一个文件描述符。在读、写文件时,可以使用这个文件描述符。 标准输入、标准输出和标准错误 按惯例,每当运行一个新程序时,所有的shell都为其打开3个文件描述符,即标准输入(standard input)、标准输出(standar
1.程序 程序是一个存储在磁盘上某个目录中的可执行文件。内核使用exec函数(7个exec函数之一),将程序读入内存,并执行内存。 2.进程和进程ID 程序的执行实例被称为进程。 UNIX系统确保每个进程都有一个唯一的数字标识符,成为进程ID。进程ID总是一个非负整数。 ``` #include <apue.h> #define BUFFSIZE 4096 int main(void) {
文件<errno.h>中定义了errno以及可以赋予他的各种常量。这些常量都以字符E开头。另外,UNIX系统手册第2部分的第1页,intro(2)列出了所有这些出错常量。 第一个规则 如果没有出错,其值不会被例程清除。因此,仅当函数的返回值指明出错时,才检验其值。 第二个规则 任何函数都不会将errno值设置为0,而且在<errno.h>中定义的所有常量不为0。 C标准定义了两个函数,他们用于打印
用户ID 口令文件登录项中的用户ID(user ID)是一个数值,他向系统标识各个不同的用户。系统管理员在确定一个用户的登录名的同时,确定其用户ID。用户不能改变其用户ID。通常每个用户有一个唯一的用户ID。 用户ID为0的用户为根用户(root)或者超级用户(superuser)。在口令文件中,通常有一个登录项,其登录名为root,称这种用户的特权为超级用户特权。 组ID 命令文件登录项也包括用
信号(signal)用于通知进程发生了某种情况。进程有以下3种处理信号的方式: (1). 忽略信号。有些信号表示硬件异常。因为这些异常产生的后果不确定,所以不推荐使用这种处理方式。 (2). 按照系统默认方式处理。 (3). 提供一个函数,信号发生时调用该函数,这被称为捕捉信号。 添加了有关信号的程序 #include "apue.h" #include <sys/wait.h> static
日历时间。该值是自协调世界时(Coordinated Universal Time, UTC) 1970年1月1日00:00:00这个特定时间以来所经过的秒数累计值。 系统基本数据类型time_t用于保存这种时间值。 进程时间。也被称为CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟滴答计算。每秒钟曾经取为50、60或100个时钟滴答。 系统基本数据类型clock_t用于保存这种时间值
系统调用接口总是在《UNIX程序员手册》的第2部分中说明,是用C语言定义的,与具体系统如何调用一个系统调用的实现技术无关。这与很多早期的操作系统不同,哪些系统按传统方式用机器的汇编定义内核入口点。 UNIX所使用的技术是为每个系统调用在标准C库中设置一个具有同样名字的函数。用户进程用标准C调用序列来调用这些函数,然后,函数又用系统所要求的技术调用相应的内核服务。例如,函数可将一个或多个C参数送入通
简要回归一下Unix的标准化过程 ISO C 本书依旧使用1999年版本。 目前GCC已经更新到7.2,8.0仍在开发当中。 IEEE POSIX POSIX指的是可移植操作系统接口(Portable Operating System Interface)。 目前所有Linux主要发行版本都兼容。 Single UNIX Specification UNIX系统供应商必须以文件形式提供符合性声明,
获得运行时限制函数 #include <unistd.h> long sysconf(int name); long pathconf(const char *pathname, int name); long fpathconf(int fd, int name); (1)如果name参数并不是一个合适的常量,这3个函数都返回-1,并把errno置为EINVAL。 (2)有些name会返回一个
功能测试宏 POXIS.1标准的早期版本定义_POXIS_SOURCE常量。在POXIS.1的2001版中,他被替换为_POXIS_C_SOURCE。 _POXIS_C_SOURCE及_XOPEN_SOURCE被称为功能测试宏(feature test macro)。所有功能测试宏都以下划线开始。 基本数据类型 头文件<sys/types.h>中定义了某些与实现有关的数据类型,他们被称为基本系统数
从今天开始学习UNIX系统,可用的文件I/O函数——打开文件、读文件、写文件等。5个函数:open、read、write、lseek以及close。不同缓冲长度对read和write函数的影响。 不带缓冲的I/O unbuffered I/O,与标准I/O函数相对照。每个read和write都调用内核中的一个系统调用。这些不是ISO C的组成部分,但是是POSIX.1和Single UNIX Sp
文件共享 内核使用3中数据结构表示打开文件,他们之间的关系决定了文件共享方面的一个进程对另一个进程可能产生的影响。 (1)每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述相关联的是: a. 文件描述符标识(close_on_exec); b. 指向一个文件表项的指针。 (2)内核为所有打开文件维持一张文件表。每个文件表项包含:
#include "apue.h" #include <fcntl.h> int main(int argc, char *argv[]) { int val; if(argc!=2) { err_quit("usage: a.out <descriptor#>"); } if((val=fcntl(atoi(argv[1]), F_G
函数stat、fstat、fstatat和lstat include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict buf); int fstat(int fd, struct stat *buf); int lstat(const char *restrict pathname, struc
stat结构成员st_size表示以字节为单位的文件长度。此字段值对普通文件、目录文件和符号链接有意义。 truncate和fruncate是文件截断函数。 #include <unistd.h> int truncate(const char *pathname, off_t length); int ftruncate(int fd, off_t length); 这两个函数将一个现有文件长
rename和renameat函数 #include <stdio.h> int rename(const char *oldname, const char *newname); int renameat(int oldfd, const char *oldname, int newfd, const char *newname); 引入符号链接的原因是为了避开硬链接的一些限制。 硬链接通常要
#include "apue.h" #include <dirent.h> #include <limits.h> typedef int Myfunc(const char *, const struct stat *, int); static Myfunc myfunc; static int myftw(char *, Myfunc *); static int dopath(Myfu
进程调用chdir或fchdir函数可以更改当前工作目录 #include <unistd.h> int chdir(const char *pathname); int fchdir(int fd); 在这两个函数中,分别用pathname或打开文件描述符来指定新的当前工作目录。 #include "apue.h" int main(void) { if(chdir("/tmp")<
这一章讲述了I/O库。很多其他操作系统都实现了标准I/O库,这个库由ISO C标准说明。Single UNIX specification对ISO C标准进行了扩充,定义另外一些接口。 35年来,几乎没有对标准I/O库进行修改 freopen函数清除一个流的定向;fwide函数可用于设置流的定向。 #include <stdio.h> #include <wchar.h> int fwide(F