Linux文件结构

1.Linux文件分为哪几类,有什么含义

(1)普通文件(regular):存在于外部存储器中,用于存储普通文件。
(2)目录文件(directory):用于存放目录项,是文件系统管理的重要文件类型。
(3)管道文件(pipe):一种用于进程间通信的特殊文件,也称为命名管道FIFO。
(4)套接字文件(socket):一种用于网络间通信的特殊文件。
(5)链接文件(link);用于间接访问另外一个目标文件,相当于widows快捷方式。
(6)字符设备文件(character):字符设备在应用层的访问结构。
(7)块设备文件(block):块设备在应用层的访问接口。


2.系统调用时应注意什么

1.系统调用函数通常在成功是返回0,不成功时返回非零值,如果要检查失败原因,则要判断全局变量errno的值,errno中包含错误代码。

2.许多系统调用的返回数据通常通过引用参数传递,这时需要函数参数中传递缓冲区地址,而返回的数据就保存在缓冲区中。

3.不能认为系统调用函数比其他函数的执行效率高,要注意系统调用是一个非常耗时的过程。


3.Linux三个基本的文件描述符


标准输入   0,  STDIN_FILENO

标准输出   1,  STDOUT_FILENO

标准出错处理   2,  STDERR_FILENO


4. 带缓冲与不带缓冲的I/O操作区别

不带缓冲的文件I/O操作主要用到6个函数,creat, open, read, write, lseek和close。不带缓冲是指每一个函数都只调用系统中的一个函数,这些函数不是ANSI C的组成部分,却是POSIX的组成部分。

标准I/O库提供缓冲的目的是就可能减少使用read和write函数额调用次数。

所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用。系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其写数据时,直接调用系统调用,将数据写入到块缓冲进行排队,当块缓冲达到一定的量时,才会把数据写入磁盘。因此所谓的不带缓冲的I/O是指进程不提供缓冲功能(但内核还是提供缓冲的)。每调用一次write或read函数,直接系统调用。
而带缓冲的I/O是指进程对输入输出流进行了改进,提供了一个流缓冲,当用fwrite函数网磁盘写数据时,先把数据写入流缓冲区中,当达到一定条件,比如流缓冲区满了,或刷新流缓冲,这时候才会把数据一次送往内核提供的块缓冲,再经块缓冲写入磁盘。(双重缓冲)
因此,带缓冲的I/O在往磁盘写入相同的数据量时,会比不带缓冲的I/O调用系统调用的次数要少。


5.fgets函数与gets函数的区别



gets函数原型:char*gets(char*buffer);//读取字符到数组:gets(str);str为数组名。
gets函数功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。读取的换行符被转换为null值,做为字符数组的最后一个字符,来结束字符串。


注意:gets函数由于没有指定输入字符大小,所以会无限读取,一旦输入的字符大于数组长度,就会发生内存越界,从而造成程序崩溃或其他数据的错误。


fgets函数原型:char *fgets(char *s, int n, FILE *stream);//我们平时可以这么使用:fgets(str, sizeof(str), stdin);
其中str为数组首地址,sizeof(str)为数组大小,stdin表示我们从键盘输入数据。


fgets函数功能:从文件指针stream中读取字符,存到以s为起始地址的空间里,知道读完N-1个字符,或者读完一行。


注意:调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。


6.printf、fprintf与sprintf的区别


都是把格式好的字符串输出,只是输出的目标不一样:
1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向)。
2 sprintf,是把格式字符串输出到指定字符串中,所以参数比printf多一个char*。那就是目标字符串地址。
3 fprintf, 是把格式字符串输出到指定文件设备中,所以参数笔printf多一个文件指针FILE*。


7.fputc、putc与putchar的区别

#include <stdio.h>
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);


fputc()写一个字符c,强制转换成一个unsigned char类型字符,到文件stream。
fputs()写一个字符串到stream,省略字符串尾部的‘\0’。
putc()与fputc()相同,只是putc()是作为一个宏实现的。
putchar(c)等同于putc(c,stdout)。
puts()写一个字符串到标准输出stdout,并自动在字符串的尾部添加一个换行符"\n"。
返回值:fputc()、putc()和putchar()成功时返回要写的字符,失败返回EOF。
puts()和fputs()成功时返回一个非负数,失败返回EOF。


8.何谓系统调用

所谓系统调用,是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这组特殊的借口来获得操作系统内核提供的的服务,例如,用户可以通过进程控制相关的系统调用来创建进程,实现进程的调度,进程管理等。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值