大家好,我是老T,今天教大家上手Linux系统的C语言编程。
我寻思诸位看官学C语言的时候一定委屈坏了,标准库里面什么都没有,容器没有,算法没有,网络没有,要啥啥没有。
不过一旦开始系统调用就不一样了,这C语言到Linux就像是闺女回了娘家,各种接口都体贴周到,可以让我们的程序员尽情放飞自我。
废话就不多说了,我们直接开始,让大家迅速上手。
文件操作
#include <sys/unistd.h>
#include <fcntl.h>
int main(){
int fd=open("text.txt",O_RDONLY);
close(fd);
}
#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
上述的代码打开了一个文件,随即又关上了。那个int 类型的变量fd 叫做文件描述符(file descriptor)。用一个数字代表一个对象,这是C语言常见的设计模式,OpenGL的实现也是类似。 它的底层一般是这样的:真正操作的对象是一个复杂的结构体,这些对象存放在一个数组中,而数字代表真实对象在数组中的索引值。
在open 和 close 之间,当然要进行一些读写操作,示例如下:
#include <sys/unistd.h>
#include <fcntl.h>
int main(){
int fd=open("test.txt",O_WRONLY);
write(fd,"hello world",11);
close(fd);
}
看到这,你可能觉得不屑一顾,这和<stdio.h> 不是差不多嘛。别急啊兄弟,这个fd 可不仅仅代表通常意义的文件,Linux的其中一个设计哲学是:一切皆文件。让我们列举一下这个fd 能代表什么:
1.文本文件和二进制文件(这两叫普通文件) 2.目录文件(可以理解为文件夹) 3.字符设备和块设备(例如网卡和硬盘) 4.套接字(实现网络通信的接口,读写它相当于网络通信) 5.符号链接(类似于windows桌面上的快捷方式) 6.管道(用于进程通信)
上面这个表你可能记不住,但是我相信你体会到了它的强大。下面是一个向控制台打印字符串的例子。
#include <sys/unistd.h>
#include <fcntl.h>
int main(){
write(STDOUT_FILENO,"hello world",11);
}
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
因为0,1,2都已经被占用了,所以我们的fd 是从3开始的,如果出错(如文件不存在)则会返回一个负数。维护fd 的数组在表示进程的结构体中,所以fd 只在它所在的进程有意义。不同的进程可以有相同的fd
虽然统一的fd 设计的非常好,但是它并不能让我们看到文件的容量、修改日期等信息。所以还有其他函数供我们使用。
int stat (const char *file_name,struct stat *buf);
struct stat
{
dev_t st_dev; 文件使用的设备号
ino_t st_ino; 索引节点号
mode_t st_mode; 文件对应的模式,文件,目录等
nlink_t st_nlink; 文件的硬连接数
uid_t st_uid; 所有者用户识别号
gid_t st_gid; 组识别号
dev_t st_rdev; 设备文件的设备号
off_t st_size; 以字节为单位的文件容量
blksize_t st_blksize; 包含该文件的磁盘块的大小
blkcnt_t st_blocks; 该文件所占的磁盘块
time_t st_atime; 最后一次访问该文件的时间
time_t st_mtime; /最后一次修改该文件的时间
time_t st_ctime; 最后一次改变该文件状态的时间
};
兄弟们,这一节就这样吧,下一节再见~~~
|