《 Unix环境高级编程 》1~5章笔记

    技术2022-05-19  21

    【第1章        UNIX基础知识】一、操作系统为程序提供服务二、登录名/etc/passwd目录保存用户信息,现在都转移到其他目录中三、Shell/bin/sh Bourne shell/bin/csh C shell四、文件系统: 文件和目录的层次安排目录是一个包含目录项(文件名+属性信息)的文件文件名: / 和 null 不能当文件名路径名*ourhdr.h 标准系统头文件 常数及函数原型 见附录B(021.PDF).引用当前目录..引用父目录man手册command(number) man手册中command第number部分 e.g. ls(1)man 1 用户e.g. man 1 lsman 2 程序员man 3 系统管理工作目录:当前工作目录起始目录:从口令文件取得五、文件描述符小的非负整数,标识特定进程正在存访的文件标准输入、标准输出和标准出错ls > file.list 重定向不用缓存的I/O<unistd.h>标准I/O<stdio.h>六、程序存放在磁盘文件中的可执行文件。使用exec函数读程序到存储器中进程:程序的执行实例。进程ID:标识进程的非负整数七、进程控制fork() 创建一个新进程exec()waitpid()八、unistd.h包含许多unix系统服务的函数原型类属指针:void *原始系统数据类型:以_t结尾的数据类型被称为原始系统数据类型<sys/types.h>中定义出错处理返回一个负值<errno.h>中九、用户ID为0 具有超级权限信号:通知进程已发生某种条件的一种技术处理信号:忽略 按系统默认方式处理 提供函数处理UNIX时间值 UTC十、系统调用和库函数系统调用:程序向内核请求服务的入口点库函数调用可以替换,系统调用不可以替换系统调用通常提供一种最小界面,而库函数通常提供比较复杂的功能【第2章        UNIX标准化及实现】UNIX标准化(界面接口) ANSI C、 IEEE POSIX、 X/Open XPG3 FIPSUNIX实现 SVR4、 4.3+BSD标准和实现的关系限制 - 通过方法限制,提高程序可移植性编译时选择项编译时限制运行时限制<limits.h> <float.h> <stdio.h> <uinstd.h>ANSI C限制 POSIX限制 XPG3限制sysconf()、pathconf() 和fpathconf()函数sysconf() pathconf()其中pathconf()第一个参数为unistd.h文件路径(/usr/include/unistd.h)FIPS 151-1要求功能测试宏:feature test macro基本系统数据类型:<sys/type.h>文件中 某些与实现有关的数据类型(primitive system data type)标准之间的冲突:ansi c没有考虑宿主操作系统【第3章        文件I/O】1 open(),read(),write(),lseek(),close()2 不带缓存的I/O3 文件描述符:非负整数,内核返回到进程,用于标识文件       #include <sys/types.h>       #include <sys/stat.h>       #include <fcntl.h>4 open函数       int open(const char* pathname, int oflag, ... /*,mode_t mode*/)       O_WRONLY O_RDONLY O_RDWR       O_APPEND到文件结尾       O_CREAT重新创建       O_EXCL测试文件是否存在       O_TRUNC文件存在截断长度为0       O_NOCTTY终端设备 则不将此设备分配作为此进程的控制终端       O_NONBLOCK FIFO、块特殊文件或字符特殊文件 非阻塞方式打开5 creat函数       int creat(const char* pathname, mode_t mode);       <=>open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode);6 close函数       #include <unistd.h>       close(int filedes)7 seek函数       #include <sys/types.h>       #include <unistd.h>       off_t lseek(int filedes, off_t offset, int whence);       失败返回-1       whence: SEEK_SET 开始 SEEK_CUR 当前 SEEK_END 结尾8 read函数       #include <unistd.h>       ssize_t read(int filedes, void* buff, size_t nbytes);       已到文件尾为0,失败返回-19 write函数       #include <unistd.h>       ssize_t write(int filedes, const void* buff, size_t nbytes);       失败返回-110 进程表项 文件表 v节点表11 原子操作(atomic operation):多步操作组成的操作,或者执行完所有步,或者一步也不执行12 dup和dup2函数        复制一个现存的文件描述符        #include <unistd.h>        int dup(int filedes);<=>fcnt1(filedes, F_DUPFD, 0);        int dup2(int filedes, int filedes2);<=>close(filedes2);+fcnt1(filedes, F_DUPFD, filedes2);+原子操作        成功返回新的文件描述符,失败为-113 fcntl函数        #include <sys/types.h>        #include <unistd.h>        #include <fcntl.h>        int fcntl(int filedes, int cmd, .../* int arg */);        失败返回-1        改变已打开的文件的性质        cmd=F_DUPFD 复制描述符        cmd=F_GETFD或F_SETFD 获取/设置文件描述符标记        cmd=F_GETFL或F_SETFL 获取/设置文件状态标志        cmd=F_GETOWN或F_SETOWN 获取/设置异步I/O有权        cmd=F_GETLK,F_SETLK或F_SETLKW 获取/设置记录锁        通过O_ACCMODE屏蔽字,取14 ioctl函数       I/O杂务箱,完成其他I/O函数不能完成的功能       #include <unistd.h> //SVR4       #include <sys/ioctl.h> //4.3_BSD       int ioctl(int filedes, int request,...);       出错返回-1【第4章        文件和目录】零struct stat{        mode_t st_mode;        /* file type & mode (permissions) */        ino_t stino;        /* i-node number (serial number */        dev_t st_dev;        /* device number (filesystem) */        nlink_t st_nlink;        /* number of links */        uid_t st_uid;                /* user ID of owner */        gid_t stgid;                /* group ID of owner */        off_t st_size;                /* size in byte, for regular files */        time_t st_atime;        /* time of last access */        time_t st_mtime;        /* time of last modification */        time_t st_ctime;        /* time of last file status change */        time_t st_blksize;        /* best I/O block size */        long st_blocks;                /* number of 512-byte blocks allocated */};/* linux中位于/usr/include/bits/stat.h中 */一、stat fstat lstat函数#include <sys/types.h>#include <sys/stat.h>int stat(const char* pathname, struct stat* buf);给定文件名,返回相关文件的信息结构int fstat(int filedes, struct stat* buf);给定文件描述符,返回相关文件的信息结构int lstat(const char* pathname, struct stat* buf);给定文件是连接时,返回连接文件信息二、文件类型普通文件(二进制,文本)目录文件(仅仅内核有写权限)设备文件字符特殊文件(character special file)-用于系统中某些类型的设备块特殊文件(block special file) - 用于磁盘设备FIFOFIFO:命名管道,用于进程通信套接口(socket):网络通信符号连接(symbolic link)文件类型宏<sys/stat.h>中三、access函数#include <unistd.h>int access(const char* pathname, int mode);成功为0,出错返回-1mode= R_OK(读) W_OK(写) X_OK(执行)四、粘住位 S_ISVTX五、chown fchown lchown函数用于更改文件的用户ID和组ID#include <sys/types.h>#include <unistd.h>int chown(const char* pathname, uid_t owner, gid_t group);int fchown(int filedes, uid_t owner, gid_t group);int lchown(const char* pathname, uid_towner, gid_t group);更改文件的用户ID和组ID成功0,失败-1六、文件截短#include <sys/types.h>#include <unistd.h>int truncate(const char* pathname, off_t length);int ftruncate(int filedes, off_t length);把文件截短为length,如果比原文件长,则用空洞'/0'补充失败返回-1成功返回0七、文件系统 ※磁盘-分区-文件系统-自举块+超级块+i表(i节点)+目录块和数据块i节点指向数据(文件在目录中)目录文件指向i节点(目录文件描述)#include <unistd.h>添加,原来存在则失败,失败-1成功0int link(const char* existingpath, const char* newpath);删除,连接数为0时才能被删除int unlink(const char* pathname);#include <stdio.h>int remove(const char* pathname);解除文件连接 文件时,与unlink相同;目录时,与rmdir相同int rename(const char* oldname, const char* newname); 重命名八、符号连接ln -s path symbo e.g. ln -s /no/such/file myfile#include <unistd.h>创建连接int symlink(const char* actualpath, const char* smpath);读连接 int readlink(const char* pathname, char* buf, int bufsize);九、文件的时间st_atime 文件数据的最后存取时间 st_mtime 文件数据的最后修改时间 st_ctime i节点状态的最后更改时间#include <sys/types.h>#include <utime.h>修改文件存取和修改时间int utime(const char* pathname, const struct utimbuf* times);#include <sys/types.h>#include <sys/stat.h>十、目录创建目录和删除空目录int mkdir(const char* pathname, mode_t mode);int rmdir(const char* pathname);读目录#include <sys/types.h>#include <dirent.h>DIR* opendir(const char* pathname);struct dirent* readdir(DIR* dp);?void rewinddir(DIR* dp);int closedir(DIR* dp);struct dirent{         ino_t d_ino;         //i-node number         char d_name(NAME_MAX+1);         //null-terminated filename}/e.g.DIR* dp;struct dirent* dirp;if (NULL == (dp = opendir(path)))        /* maybe can't read */while (NULL != (dirp = readdir(dp))){        //dirp->d_name;}closedir(dp);/#include <unistd.h>更改当前工作目录int chdir(const char* pathname);int fchdir(int filedes);得到当前工作目录char* getcwd(char *buf, size_t size);十一、设备号主设备号,次设备号用宏major()和minor()来取/e.g.struct stat stat;int major, minor;lstat(pathname, &stat);major = major(stat.st_dev);minor = minor(stat.st_dev);/十二、缓存#include <unistd.h>void sync(void)将修改的缓存排入队列,执行后不等I/O操作完成立即返回int fsync(int filedes)确保修改的块直接写入磁盘,执行后等待I/O操作完成后返回【第5章        标准I/O库】 一、标准库中的I/O操作中流与文件相结合;FILE对象结构 用于管理流预定义的三个流STDIN_FILENO标准输入,STDOUT_FILENO标准输出,STDERR_FILENO标准出错stdin, stdout, stderr//e.g. #include <stdio.h>int main(){        char writebuf[] = "this is test stdin, stdout, stderr/n";        char readbuf[10] = {0};        fwrite(writebuf, sizeof(writebuf), sizeof(char), stdout);        fread(readbuf, 9, sizeof(char), stdin);        printf("readbuf = %s/n", readbuf);        return 0;}//#inlcude <stdio.h>二、缓存:全缓存,行缓存,不带缓存修改缓存void setbuf(FILE* fp, char* buf);int setvbuf(FILE* fp, char* buf, int mode, size_t size);强制刷新流,使未缓存中未写入的数据写入内核int fflush(FILE* fp);三、打开和关闭FILE* fopen(const char* pathname, const char* type);FILE* freopen(const char* pathname, const char* type, FILE* fp);FILE* fdopen(int filedes, const char* type);int fclose(FILE* fp);四、读写流读一个字节int getc(FILE *fp);是宏int fgetc(FILE *fp);函数int getchar(void);成功返回字符,出错或到文件结尾返回EOFint ferror(FILE* fp);int feof(FILE* fp);非0为真 0为假输出一个字节int putc(int c, FILE* fp);int fputc(int c, FILE* fp);int putchar(int c);成功为C,出错为EOF每次一行char* fgets(char* buf, int n, FILE* fp);char* gets(char* buf);※不推荐使用char* fputs(const char* str, FILE* fp);char* puts(const char* str);二进制I/Osize_t fread(void* ptr, size_t size, size_t nobj, FILE* fp);size_t fwrite(const void* ptr, size_t size, size_t nobj, FILE* fp);成功返回操作对象数,失败-1定位流long ftell(FILE* fp);成功为当前文件位置,出错返回-1Lint fseek(FILE* fp, long offset, int whence);成功0 失败非0void rewind(FILE* fp);设置流到文件的起始位置int fgetpos(FILE* fp, fpos_t* pos);int fsetpos(FILE* fp, const fpos_t* pos);成功为0,失败非0格式化I/Oint printf(const char* format, ...);输出到标准输出流int fprintf(FILE* fp, const char* format, ...);输出到指定流 成功返回输出字符数,出错为负值int sprintf(char* buf, const char* format, ...);输出到数组 返回存入数组的字符数int vprintf(const char* format, va_list arg);int vfprintf(const char* format, va_list arg);int vsprintf(char* buf, const char* format, va_list arg);int scanf(const char* format, ...);int scanf(FILE* fp, const char* format, ...);int sscanf(const char* buf, const char* format, ...);int fileno(FILE* fp); 返回文件描述符五、临时文件char* tmpnam(char* ptr)产生一个与现在文件名不同的一个有效路径名字符串FILE* tmpfile(void)建立临时文件char* tempnam(const char* directory, const char* prefix);directory目录 prefix前缀六、标准I/O的替代软件标准I/O的不足要复制两次:内核到标准I/O的缓存、标准I/O的缓存到用户程序替代fio(快速IO库)sfioASI(Alloc Stream Interface)。


    最新回复(0)