“一切皆文件”是Unix设计的核心思想,那我们的系统编程的介绍就从这里开始,关于文件的IO操作氛围系统调用和C标准库,这里我主要说的是系统调用。
所有的执行I/O操作的系统调用都以文件描述符,一个非负整数来指代打开的文件,文件描述符用以表示所有类型的已打开文件,而且每个进程都维护着各自的打开文件列表,成为文件表(file table),该表由文件描述符作为索引,每一项都存储着文件打开的信息(文件的打开模式,存储位置等信息)。
一般情况下,每个进程至少会打开三个文件描述符:0,1和2,除非用户显示的关闭他们,否则他们就会默认的打开,文件描述符0代表标准输入流(stdin),1文件描述符代表标准输出流(stdout),2文件描述符代表错误输出流(stderr)
对于大部分语言而言,文件IO都分为三部分,打开文件,读写,关闭文件。作为第一节对于文件IO的初步认识,这里给出一段最简单的文件操作代码,并做简单分析
#include <stdio.h>
#include <fcntl.h> //这是文件IO下同调用的关键头文件
#include <unistd.h>
int main(int argc, char *argv[])
{
int fd;
char content[]="Hello World";
fd = open("demo1.txt", O_RDWR | O_CREAT);//以读写模式打开,若不存在则创建该文件
if (fd == -1) //进行检测
{
printf("open file failed\n");
return -1;
}
if(write(fd, content, sizeof(content)) != sizeof(content)) //向文件中写入字符串
{
printf("somethin wrong\n");
return -1;
}
close(fd); //关闭文件句柄
return 0;
}
最后说一下,如果在linux命令行里想看到系统调用的,例如open,可以使用
man 2 open //查看系统调用open的用法
其中2数字代表系统调用,如果什么都不加,默认是1,即查看linux命令
1:普通的命令
2:系统调用,如open,write等,还有其对应的头文件
3:库函数,如printf,fread
4:特殊文件,也就是/dev下的各种设备文件
5:指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义
6:给游戏留的,由各个游戏自己定义
7:附件还有一些变量,比如向environ这种全局变量在这里就有说明
8:系统管理用的命令,这些命令只能由root使用,如ifconfig