Unix环境高级编程学习笔记(三):标准I/O , 系统数据文件和信息

1 标准I/O函数不同于read,write函数,是其在流上进行操作,

当首次调用标准I/O函数时,系统会首先调用malloc,为流创造缓冲区,

2 fopen函数

#include<stdio.h>

file * fopen(const char* pathname, const char * restrict name);

打开返回指针,出错返回NULL,

type的取指有r(读),w(写),a(追加),r+/w+(读+写),a+(读+写+追加)

int fclose(file* fp)

成功返回0,失败返回EOF

3 一旦打开流,系统支持三种不同I/O方式,

1每次一个字符

2 每次一行(fgets,fputs)

3 直接I/O,读取某种数量的数据,也称面向结构I/O(fread,fwrite)

1每次一个字符,输入函数

int getc(file * fp)

int fgetc(file *fp)

int getchar(void)

成功返回下一个字符,失败返回EOF

getchar()等价于getc(stdin),getc与fgetc的区别是getc可能被实现为宏,而fgetc一定是一个函数

EOF被定义为负值,通常为-1

为区分上面函数返回值究竟是错误还是EOF,我们定义这两个函数

int ferror(file* fp);

int feof(file * fp);

可以将数据输入回流中

ungetc(int c, file* fp)

成功返回c,失败返回EOF

输出函数,对应于每一个上面的输入函数

int putc(file* fp)

int fputc(file* fp)

int putchar(void)

2 每次一行

char* fgets(char * buf ,int n ,fille* fp)

char * gets(char*buf)

成功返回buf,失败返回NULL

gets直接从stdin读输入,但是非常不推荐这个函数,因为没有指定缓冲区大小,容易造成缓冲区溢出

同样对应着输出函数

int fputs(char* buf, int n, file* fp)

int gets(char*buf)

同样不推荐gets

3 面向结构输入输出

size_t fread(void * ptr, size_t size, size_t nobj, file* fp)

size_t fwrite(void *ptr , size_t size, size_t nobj, file* fp)

ptr是buf,size是单个结构体的大小,nobj是要读写对象个数

4 ftell和fseek函数

long ftell(file* fp)

int fseek(file* fp,long offset ,int whence)

ftell是以字节为度量,返回距文件开头的距离,fseek中的offset也是以字节为度量的偏移

5 这里每一个关于流的I/O函数其实最终都是调用关于文件描述符的I/O完成的

int fileno(file* fp)

将流转换为文件描述符

系统数据文件和信息:

6 /etc/passwd中字段,以及字段含义

root   :x     :0       :0    :root  :/root      :/bin/bash

用户名:密码:用户id:组id:注释:工作目录:启动shell

7 getpwuid函数,getpwgid函数,通过uid,gid读取口令文件

#include<pwd.h>

struct passwd* getpwuid(uid_t uid)

struct passwd* getpwnam(const char* name)
时间: 2024-10-22 03:03:39

Unix环境高级编程学习笔记(三):标准I/O , 系统数据文件和信息的相关文章

APUE学习笔记:第六章 系统数据文件和信息

6.1 引言 UNIX系统的正常运行需要使用大量与系统有关的数据文件,针对这些数据文件的可移植接口是本章的主题.本章还介绍了系统标识函数.时间和日期函数 6.2 口令文件 UNIX系统的口令文件包含了下列各字段,这些字段包含在<pwd.h>中定义的passwd结构中 用户名 char *pw_name 加密口令 char *pw_passwd 数值用户ID uid_t pw_uid 数值组ID gid_t pw_gid 注释字段 char *pw_gecos 初始工作目录 char *pw_d

UNIX环境高级编程学习笔记(第一章UNIX基础知识)

总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时候使用的平台是Windows+VMware+debian,使用secureCRT来连接(可以实现多个终端连接). 因为第一章是本书大概的描述,所以第一章的我打算写得详细一点,而且书本的原话占的比例会比较多,重点的东西会用粗体显示出来. 1.1  引言 所有操作系统都为他们所运行的程序提供服务.典型的

APUE学习笔记(第六章 系统数据文件和信息)

UNIX系统的正常运作需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group就是经常被多个程序频繁使用的两个文件. 口令文件 UNIX系统口令文件包含如下字段,这些字段包含在<pwd.h>中定义的passwd结构中 口令文件是/etc/passwd,每一行包含上面各字段,字段之间用冒号分隔.可以使用finger命令打印指定用户的有关信息:finger -p 用户名 POSIX.1定义了两个获取口令文件项的函数,在给定用户登录名或数值用户ID后,这两个

Unix环境高级编程学习笔记(五):进程控制

1 getpid函数,getppid函数,得到进程id,得到父进程id #include<unistd.h> pid_t getpid(void) pid_t getppid(void) uid_t getuid(void)得到实际用户id uid_t geteuid(void)得到有效用户id gid_t getgid(void)得到实际组id gid_t getegid(void)得到有效组id 2 fork函数,当前进程创建新进程 #include<unistd.h> pid

Unix环境高级编程学习笔记(四):进程环境

1 exit函数与_Exit函数 #include<stdlib.h> void exit(int status) void _Exit(int status) 这两个函数的不同之处在于exit函数先执行清理工作后再进入内核(清理I/O缓冲),_Exit函数直接进入内核 2 atexit函数,登记函数,在exit的时候执行 int atexit(void (* func) (void)); 被登记的函数称为终止处理函数,这些函数的调用顺序与登记顺序相反,如果一个函数被登记多次,也会被调用多次

Unix环境高级编程学习笔记(七):线程

1 线程包含线程ID,一组寄存器的值,栈,调度优先级和策略,信号屏蔽字,errno变量,以及线程私有数据.进程的所有信息对于该进程的所有线程都是共享的,包括可执行程序文本,程序全局内存和堆内存,栈以及文件描述符. 线程可以通过pthread_self函数获得自身线程ID #include<pthread.h> pthread_t pthread_self(void) 新增进程可以通过pthread_create函数创建 #include <pthread.h> int pthrea

UNIX环境高级编程(第三版)关于apue.h的用法

UNIX环境高级编程(第三版)中的例子用到apue.h这个头文件,但是书里面写的地址已经不能访问. 经过一番查找之后,找到如下解决方案: 1.到www.apuebook.com上下载第2版的源码,也可以直接点这里. 2.下载后的源码,需要修改一下: 1.Make.defines.linux中第6行WKDIR=/home/sar/apue.2e更改为目录的绝对路径. 2.apue.2e/ipp/ipp.h中第122行中的status换为Status.(也可换为其他,但要与下面对应) 3.apue.

OS X下UNIX环境高级编程(第三版)学习日志-第一章ChapterI,编译apue包与第一个例程

1.从网络上获取代码,地址如下apue最新官方下载地址 2.解压到本地 由于最新版本是第三版(3rd Edition),apue.3e,就是我们要的源代码 3.编译源代码 编译过程中笔者并未遇到任何问题,所以建议大家也下载最新版本的代码来学习,贴一下笔者的环境信息 Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple

UNIX环境高级编程学习环境搭建---apue.h

本菜刚刚学习UNIX下高级编程,无奈搭建本书编程环境时遇到不少问题.幸好网上有各种大神的解决办法让我最终解决了问题.在这里感谢为LINUX开源操作系统奋斗的大神. 不过话说回来,网上大都是针对UNIX高级编程第二版的头文件搭建,现在对于第三版来说,有些过时,因为很对针对linux的make文件已经改变了很多. 话不多说,下面就来看看具体的搭建过程:(本人用的操作系统是ubuntu 14.04LTS) 1.在网上下载书中源代码,点击打开链接 2.解压文件:tar -zxvf *.tar.gz 3.