Linux环境编程-文件基本操作

Linux 下目录是/这样的 而windows是/怎么记呢?/和w是不是一样的反向?所以Linux的目录就是反的反向,好记了。

一:open函数

名称:open

目标:打开一个文件。

头文件:#include

#include

#include < fcntl.h>

函数原形:int open(const char * pathname,int flags);

int open(const char * pathname,int flags,mode_t mode);

参数: pathname 文件名

flags 打开模式

返回值:-1 遇到错误

int 打开成功,返回文件描述符。

这个系统调用在进程和文件之间建立一条连接,这个连接被称为文件描述符,它就像一条由进程通向内核的管道。

要打开一个文件,必须指定文件名和打开模式,有3种打开模式:只读,只写,可读可写,分别对应于O_RDONLY,O_WRONLY,O_RDWR,这在头文件/usr/include/fcntl.h中有定义。

打开文件是内核提供的服务,如果在打开过程中内核检测到任何错误,这个系统调用就会返回-1。错误的类型是各种各样的,如:要打开的文件不存在。即使文件存在可能因为权限不够而无法打开,在open的联机帮助中列出了各种可能的错误,大家可以看看。

UNIX允许一个文件被多个进程访问,也就是说当一个文件被一个进程打开后,这个文件还可以被其它进程打开。

如果文件被顺利打开内核会返回一个正整数的值,这个数值就叫文件描述符,文件描述符是是一个简单的整数,用以标明每一个被进程所打开的文件,描述符0代表标准输出,对应的宏是 STDOUT_FILENO,描述符1代表标准输入,对应的宏为STDIN_FILENO,描述符2代表标准错误输出,对应的宏为STDERR_FILENO,系统给进程分配描述符都是从3开始的,如果同时打开好几个文件,它们所对应的的文件描述符是不同的,如果一个文件打开多次,对应的文件描述符也不相同。必须通过文件描述符对文件操作。下面的程序可以证明这一点。

二:read函数

名称:read

目标:把数据读到缓冲区。

头文件:#include < unistd.h>

函数原形:ssize_t read(int fd, void *buf, size_t count)

参数: fd 文件描述符

buf 用来存放数据的目的缓冲区

count 要读取的字节数

返回值:-1 遇到错误

numread 成功关闭,返回所读取的字节数目。

read这个系统调用请求内核从fd所指定的文件中读取qty字节的数据,存放到buf所指定的内存空间中,内核如果成功地读取了数据,就返回所读取的字节数目。否则返回-1。

当文件的字节数没有你想要的那么多时,read就会判断下一个数值是不是’/0’,如果是就停止读取,然后退出。numread返回的是’/0’之前的字节数,也就是是原文件的字节数而不是你想读的字节数。

三:close函数

名称:close

目标:关闭一个文件。

头文件:#include < unistd.h>

函数原形:int close(int fd)

参数: fd 文件描述符

返回值:-1 遇到错误

int 关闭成功,返回文件描述符。

Close这个系统调用会关闭进程和文件fd之间的连接,如果关闭过程中出现错误,close返回-1,如:fd所指的文件并不存在。关闭成功则返回文件描述符。

代码: 一个基本的打开文件,读取,并关闭的例子

#include

#include

#include

#include

#include

#include

main()

{

int fd,size;

char s [ ]="Linux Programmer!/n",buffer[1024];

fd=open("show_read.c",O_RDONLY);

size=read(fd,buffer,sizeof(buffer));

close(fd);

printf("%s",buffer);

}

四:craet函数

名称:creat

目标:创建/重写一个文件

头文件:#include

#include

#include < fcntl.h>

函数原形:int creat(const char *pathname,mode_t mode)

参数: pathname 文件名

mode 访问模式

返回值:-1 遇到错误

/fd 创建成功,返回文件描述符

Creat告诉内核创建一个名为filename的文件,如果这个文件不存在,就创建它,如果已经存在,就把它的内容清空,把文件的长度设为0。

如果内核成功地创建了文件,那么文件的许可位(permission bits)被设置为由第二个参数mode所指定的值.如:

fd=creat(“addressbook”,0644);

创建一个名为addressbook的文件,如果文件不存在,那么文件的许可位被设为 rw-r-r—.

如果文件已存在它的内容会被清空。任一情况下,fd都会是指向addressbook的文件描述符。

五:write函数

名称:write

目标: 将内存中的数据写入文件。

头文件:#include < unistd.h>

函数原形:size_t write(int fd, const void *buf, size_t count)

参数: fd 文件描述符

buf 内存数据

count 要写的字节数

返回值: -1 遇到错误

Num written 成功写入,返回写入的字节数目。

在实际的写入过程中,可能会出现写入的字节数少于所要求的。这可能有两个原因,第一是有的系统对文件的最大尺寸有限制,第二是磁盘空间接近满了。在上述两种情况下内核都会尽力把数据往文件中写,并将实际写入的字节数返回,所以调用write后都必须检查返回值是否与要写入的相同,如果不同就要采取相应的措施。

学完上面几个系统调用,我们就可以自己编写的cp命令了。它的基本思路是从原文件读取数据写入缓冲,再将缓冲的数据写入目标文件。

代码:新建一个文件并写入内容

#include

#include

#include

#include

#include

#include

main()

{

int fd,size;

char s [ ]="Linux Programmer!/n",buffer[1024];

char filename[]="newfile.txt";

fd=creat(filename,0644);

fd=open(filename,O_WRONLY|O_CREAT);

write(fd,s,sizeof(buffer));

fd=open(filename,O_RDONLY);

size=read(fd,buffer,sizeof(buffer));

close(fd);

printf("%s",buffer);

}

(0)

相关推荐

  • Linux环境编程-编辑器基本操作

    vim使用 新建文件 #vim hello.c 插入模式 按下I键,底下出现- - 插入- - 换行:按下Enter 删除字符:普通模式下按x 删除整行:按dd 恢复删除:按u 取消命令: Ctrl+ ...

  • linux环境编程-IPC 之 msg queue

    消息队列 在UNIX的SystemV版本,AT&T引进了三种新形式的IPC功能(消息队列、信号量、以及共享内存)。但BSD版本的UNIX使用套接口作为主要的IPC形式。Linux系统同时支持这 ...

  • linux环境编程-ftok()函数详解

    系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。 ftok原型如下: key_t ftok( char * fname, int id ) f ...

  • Linux环境下VI/VIM编辑文件时无权限保存的解决方法(普通用户)

    在Linux环境下,如果直接使用VI/VIM命令编辑没有修改权限的文件时,保存的时候就会提示用户无法进行保存操作,一般的解决方法只能是关闭文件重新以sudo权限打开该文件编辑后再保存(前提是用户具有s ...

  • 如何培训Unix员工管理Linux环境?

    把Unix迁移到Linux实际操作时会遇到很多困难,培训员工迁移是不是更难呢?会不会遇到更多问题呢?备份和高可用性又了解得如何?你如何监控性能并调节你的系统呢?你又如何确保为你的员工有提供了足够的技巧 ...

  • 在微软Windows平台上打造Linux环境方法教程

    在这篇文章里,我将向大家分享一些软件安装和环境设置方法,这是我最近的实践收获,并对使用效果非常满意。我不能永远待在Linux上开发,但我非常喜欢Linux终端和Linux环境,在开发一些开源软件时,L ...

  • linux多线程编程详解教程

    这篇文章主要介绍了linux多线程编程详解教程,提供线程通过信号量实现通信的代码,大家参考使用吧 线程分类 线程按照其调度者可以分为用户级线程和核心级线程两种。 (1)用户级线程 用户级线程主要解决的 ...

  • linux环境下一个进程最多能有多少个线程

    以下是对在linux环境下一个进程最多能有多少个线程进行了介绍,需要的朋友可以过来参考下 默认情况下: 主线程+辅助线程 +<253个自己的线程<=255 含主线程和一个辅助线程,最多25 ...

  • 在Kali Linux 环境下设置蜜罐的方法

    Pentbox是一个包含了许多可以使渗透测试工作变得简单流程化的工具的安全套件.它是用Ruby编写并且面向GNU/Linux,同时也支持Windows.MacOS和其它任何安装有Ruby的系统.在这篇 ...