不带缓冲的文件I/O操作

一.操作系统管理的资源?
文件管理,进程管理,设备管理,网络协议栈,内存管理。

二.Linux操作系统概述

1.Linux操作系统的构成?
用户空间,内核空间

2.为什么划分为用户空间,内核空间?
在Linux中,为了更好地保护内核空间,将程序的运行空间分为内核空间和用户空间,它们分别运行在不同的级别上,在逻辑上是相互隔离的。因此,用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。

3.用户空间如何访问内核空间?
(1)通过系统调用(软中断):
什么是系统调用?
操作系统提供给用户一组特殊的接口(即函数原型),用户可以通过这些特殊的接口来获得操作系统内核提供的服务。这些接口称为用户编程接口(API)。
(2)硬件中断
如键盘,鼠标等。

4.系统调用是怎么发起的?
系统调用不是程序员(用户)直发起的,而是通过调用这些系统提供的API,这些函数的内部实现发起系统调用。

5.系统命令与系统调用API的关系
系统命令相对API更高一层,它实际上是一个可执行程序,它的内部引用了API来实现相应的功能。

三.文件描述符
文件描述符是一个非负整数,操作一个文件的文件描述符,相当于操作这个文件。

一个进程启动时,都会打开三个文件:
标准输入:STDIN_FILENO 0
标准输出:STDOUT_FILENO 1
标准出错处理:STDERR_FILENO 2

使用这些宏,包含的头文件为:unistd.h

四.不带缓冲的文件I/O操作
不带缓存的文件I/O操作,主要用到6个函数??creat、open、read、write、lseek和close。这里的不带缓存是指每一个函数都只调用系统中的一个函数,这些函数虽然不是ANSI C的组成部分,但是是POSIX的组成部分。
1.creat
函数原型:int creat(const char *pathname, mode_t mode)
pathname:创建的文件名,可带路径
mode:所创建的文件属性 。有一些宏 S_IRWXU,S_IRUSR,S_IWUSR,S_IXUSR;
S_IRWXG,S_IRGRP等等。或者直接用数字表示 如0655。
返回值:成功创建返回新的文件描述符,创建失败返回-1,并把错误代码给errno。

2.open
函数原型:
int open(const char *pathname, int flags)
int open(const char *pathname, int flags, mode_t mode)

flags: 打开的方式,有如下一些宏
O_RDONLY:以只读方式打开
O_WRONLY :以只写方式打开
O_RDWR:以读写方式打开
还有一些flags:O_CREAT(不存在就创建), O_APPEND(以末尾追加的方式打开)
返回值:成功返回文件描述符,错误返回-1

3.write
函数原型:
ssize_t write(int fd, const void *buf, size_t count)
将buf所指的空间里的内容写count个字节到文件fd中去。
返回值:实际写入的字节数

4.read
函数原型:
ssize_t read(int fd, const void *buf, size_t count)
将文件fd中的内容读count字节到buf中
返回值:实际读到的字节数

5.lseek
函数原型:
off_t lseek(int fildes, off_t offset, int whence)
whence:
SEEK_SET:文件头
SEEK_CUR:当前位置
SEEK_END:文件末尾
offset:为相对于whence的相对偏移量,正数代表往后移,负数代表往前移。
返回值:距离文件开头的字节数

6.close
函数原型:int close(int fd)

以下例子为将hello world 写入文件,并将其读出来。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    char buffer[1024] = "hello world";
    if(argc != 2)
    {
        printf("Please input file name!\n");
    exit(1);
    }

    int fd;

    fd = open(argv[1], O_RDWR | O_CREAT, 0755);
    if(fd == -1)
    {
        perror("open error:");
    exit(1);
    }

    int n_write = write(fd, buffer, strlen(buffer));
    if(n_write == -1)
    {
        perror("write error:");
    exit(1);
    }
    printf("write number:%d\n",n_write);

    memset(buffer, 0, sizeof(buffer));

    lseek(fd, 0, SEEK_SET);

    int n_read = read(fd, buffer, sizeof(buffer));
    if(n_read == -1)
    {
        perror("read error");
         exit(1);
    }
    buffer[n_read] = '\0';
    printf("r_buffer:%s", buffer);
    close(fd);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/pencher_liu/article/details/54588466
今日推荐