C语言在linux下编程详解

目录文件操作总结

文件操作

#include <sys/unistd.h>//含有close函数#include <fcntl.h>//含有open函数int main(){    int fd=open("text.txt",O_RDONLY);     close(fd);}//O_RDONLY是一个宏,代表这个文件只读,常用的就是这三个#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); //向文件中写入了hello world    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);}//上面的STDOUT_FILENO是一个宏,表示标准输出,它们的定义是这样的:#defineSTDIN_FILENO0/* Standard input.  */#defineSTDOUT_FILENO1/* Standard output.  */#defineSTDERR_FILENO2/* Standard error output.  */

因为0,1,2都已经被占用了,所以我们的fd是从3开始的,如果出错(如文件不存在)则会返回一个负数。维护fd的数组在表示进程的结构体中,所以fd只在它所在的进程有意义。不同的进程可以有相同的fd

虽然统一的fd设计的非常好,但是它并不能让我们看到文件的容量、修改日期等信息。所以还有其他函数供我们使用。

//需包含<sys/stat.h>头文件,其详细内容如下所示int stat (const char *file_name,struct stat *buf);struct stat{    dev_t     st_dev;     /* ID of device containing file */文件使用的设备号    ino_t     st_ino;     /* inode number */    索引节点号     mode_t    st_mode;    /* protection */  文件对应的模式,文件,目录等    nlink_t   st_nlink;   /* number of hard links */    文件的硬连接数      uid_t     st_uid;     /* user ID of owner */    所有者用户识别号    gid_t     st_gid;     /* group ID of owner */   组识别号      dev_t     st_rdev;    /* device ID (if special file) */ 设备文件的设备号    off_t     st_size;    /* total size, in bytes */ 以字节为单位的文件容量       blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小       blkcnt_t  st_blocks;  /* number of 512B blocks allocated */ 该文件所占的磁盘块      time_t    st_atime;   /* time of last access */ 最后一次访问该文件的时间       time_t    st_mtime;   /* time of last modification */ /最后一次修改该文件的时间       time_t    st_ctime;   /* time of last status change */ 最后一次改变该文件状态的时间   };

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注的更多内容!

联系朋友别欠费,天空辽阔任你飞,再多困难别后退! “

C语言在linux下编程详解

相关文章:

你感兴趣的文章:

标签云: