标准I/O库之缓冲

标准io提供缓冲的目的是尽可能减少read和write的调用。他对每个流进行缓冲管理,减少了编码的复杂度。标准IO库提供了三种类型的缓冲。

1.全缓冲。当缓冲区填满之后才进行实习操作,驻留在磁盘上的文件通常都是全缓冲的。在第一个流上执行第一次io操作时,相关函数用malloc获得所需的缓冲区。

2.行缓冲。在输入和输出中遇到换行符的时候,标准库执行IO操作。当流涉及到一个终端的时候,通常使用行缓冲。

3.不带缓冲。标准IO库不对字符进行缓冲储存,stderr通常时不带缓冲的,这就可以使出错信息可以尽快显示出来。

当且仅当标准输入和标准输出并不涉及互交式设备时候,流才是全缓冲的。

标准出错输出不会是全缓冲的。

可以用setbuf,setvbuf更改流的类型。

下面有个程序很好的解释了以上:

#include

void pr_stdio( const char *, FILE * );

int main(void){

FILE *fp;
fputs(“enter any character\n”, stdout );
if( getchar() == EOF )
fputs(“getchar error\n”, stderr );

fputs(“one line to standard error”,stderr );

pr_stdio( “stdin”, stdin );
pr_stdio( “stdout”, stdout );
pr_stdio( “stderr”, stderr );

if( (fp=fopen(“/etc/motd”, “r”)) != NULL )
fputs(“fopen error”, stderr );
if( getc(fp) == EOF )
fputs(“getc error\n”, stderr );
pr_stdio(“/etc/motd”,fp);

return 0;
}

void pr_stdio( const char *name, FILE *fp ){
printf(“stream = %s “, name );
/*
*Not Portable
*/

if( fp->_IO_file_flags & _IO_UNBUFFERED )
printf(“unbuffered”);
else if( fp->_IO_file_flags & _IO_LINE_BUF )
printf(“line buffered”);
else
printf(“fully buffered”);
printf(“, buffer size = %d \n”,
fp->_IO_buf_end – fp->_IO_buf_base );
}

继续阅读 →

APUE 文件和目录 几个小知识点

如果用open或creat创建已经存在的文件,则该文件的访问权限位不变。

文件中的空洞是由所设置的偏移量超过文件的尾端,并写了某些数据造成的。空洞不占用磁盘空间,只是打开文件时在内核用一个值为0的数据结构表示。相同长度的文件,含有空洞的文件占用的磁盘块(du  <文件>)可能少一些,用这可以大致判断一个文件是否有空洞。

int unlink( const char *pathname )函数删除目录项,并将由pathname所引用文件的链接技术 -1,如果还有指向该文件的其他链接,则仍然可以通过其他链接访问该文件的数据。只有当链接计数达到0时,该文件的内容才会删除。另一个条件也会阻止删除文件的内容—-只要有进程打开了该文件,其内容也不能删除。如果pathname是符号链接,那么unlink删除符号链接,而不会删除由该链接所引用的文件。给出符号链接的情况下,没有一个函数能删除由该链接所引用的文件。

我们也可以用remove函数删除对一个文件活目录的链接,对于文件,remove的用能与unlink相同,对于目录,remove的功能与rmdir相同。

内核对目录树的深度没有内在限制,但是如果路径名的长度超过了PATH_MAX,则有许多命令会失败。

stat结构中st_atime,st_mtime,st_ctime分别是文件数据的最后访问时间,文件数据的最后修改时间,i节点状态的最后更改时间。

父目录中的每一个子目录都会使该父目录的链接计数增1.

继续阅读 →

APUE 文件I/O 小结

手头有本《Unix环境高级编程 (APUE) 》,就在慢慢看,这两天把文件I/O看了看,现在总结一下。

这一章主要介绍的是非缓冲I/O(unbuffered I/O) ,表示每个read,write操作都进行一次系统调用,他不是标准C的一部分,是POSIX.1single UNIX Specification的一部分。知识点有一下几个部分。

文件描述符:内核向进程返回的一个非负整数,读写文件或进行相关操作的时候用他来标识文件。标准输入0,标准输出1,标准错误输出2分别由符号常量STDIN_FINLENO,STDOUT_FILENO,STDERR_FILENO表示。文件描述符一般选择未用的最小数,不超过OPEN_MAX(大多为63).

open函数:

#include<fcntl.h>

int open( const char * filename, int flag, ../* mode_t */ );

出错时候返回-1,成功返回文件描述符

flag可以是读(O_RDONLY),写(O_WRONLY),读写(O_RDWR),注意着三者不能用|来合并。还有一些可选的常量,比如,O_APPEND表示每次写都添加到文件末尾,O_CREAT创建文件时候要指定第三个参数文件权限,O_TRUNC打开文件时候清空。

lseek函数:

#include<unistd.h>

off_t lseek( int fd, off_t offset, int whence ) ;

成功时候返回偏移量,否则返回-1,虽然说off_t可以为负值,但是返回的时候的意义是相对于文件文件开头(SEEK_SET)的。

whence有三种(SEEK_SET, SEEK_CUR,SEEK_END),分别是相对于文件开始,当前偏移量,和文件结尾。当用lseek确定好要操作的文件位置之后,就能在返回的偏移位置上进行读写了。如果文件描述的是一个管道,FIFO或者网络套接字,则lseek返回-1,并将errno设置为ESPIPE。
(更多…)

继续阅读 →

linux编程初试

今天的java项目搞了一个下午,后来发现是一个小问题纠结了很长时间,悲剧。

刚刚12点,睡不着,就练习下linux编程吧,前段时间买了本《linux程序设计》,感觉挺好的,就随便看看。

照着例题敲了下,顺便总结下:

例程在P104,扫描目录。

本程序的目的是扫描一个目录,并且把目录下的内容输出出来,主要操作在printdir函数内完成。

DIR是一个目录流结构体,在dirent.h头文件中声明,目录流指针(DIR *)被用来完成各种目录操作,其使用方法与普通文件流指针(
FILE *)很相似,目录数据项在dirent结构体中返回,用户不能更改DIR中的字段。dirent结构题中包括d_ino表示文件的inode节点号,表示文件名的name等等,其相应的操作有:

(更多…)

继续阅读 →

CentOS 配置本地源,安装 LAMP

学校的服务器不能访问外面,所以就要用光盘镜像来作为yum源来安装软件首先需要挂载镜像:

1.挂载

  • 如果是镜像,则用  mount -o loop 镜像所在地方 /media/cdrom
  • 如果是光盘,则用 mount /dev/cdrom /media/cdrom
  • 这里是挂在在/media/cdrom中,具体自定
2.修改源的文件(可选)
  • vi /etc/yum.repos.d/CentOS-Media.repo 这里/media/cdrom是默认的位置,所以不需要添加。
  • baseurl= file:///media/cdrom/  也可以挂载在/media/CentOS
3.只用本地源进行安装
  • yum –disablerepo=/* –enablerepo=c5-media install ***

4.安装apache

  • yum install httpd httpd-devel
  • 安装完成后,用/etc/init.d/httpd start 启动apache
  • 设为开机启动:chkconfig httpd on
5.安装php及其扩展
  • yum install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml
  • /etc/init.d/httpd start
6.安装mysql
  • yum install mysql mysql-server mysql-devel
  • 同样,完成后,用/etc/init.d/mysqld start 启动mysql
  • 设置mysql密码===:
  • USE mysql;
  • UPDATE user SET Password=PASSWORD(‘newpassword’) WHERE user=’root’;
  • FLUSH PRIVILEGES;
  •  chkconfig mysqld on 开机启动
7.安装memcache。。。。待定

继续阅读 →