IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言进阶——系统级编程(1) -> 正文阅读

[C++知识库]C语言进阶——系统级编程(1)

大家好,我是老T,今天教大家上手Linux系统的C语言编程。
我寻思诸位看官学C语言的时候一定委屈坏了,标准库里面什么都没有,容器没有,算法没有,网络没有,要啥啥没有。
不过一旦开始系统调用就不一样了,这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的实现也是类似。
它的底层一般是这样的:真正操作的对象是一个复杂的结构体,这些对象存放在一个数组中,而数字代表真实对象在数组中的索引值。

openclose之间,当然要进行一些读写操作,示例如下:

#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是一个宏,表示标准输出,它们的定义是这样的:
#define	STDIN_FILENO	0	/* Standard input.  */
#define	STDOUT_FILENO	1	/* Standard output.  */
#define	STDERR_FILENO	2	/* 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++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:01:58  更:2021-08-25 12:02:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 6:25:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计