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是一个宏,表示标准输出,它们的定义是这样的:
#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 */ 最后一次改变该文件状态的时间
};

总结

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

(0)

相关推荐

  • 浅谈Linux环境下并发编程中C语言fork()函数的使用

    由fork创建的新进程被称为子进程(child process).fork函数被调用一次,但返回两次.子进程的返回值是0,而父进程的返回值则是新进程的进程ID.将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID.fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getpid以获得其父进程的进程ID. 使fork失败的两个主要原因是:系统中已经有了太多的进程,或者该实际用户ID的进程总数超过

  • Linux下C语言实现C/S模式编程

    由标题可知,这篇文章主要讲如何用C语言实现一个C/S模式的程序. 主要功能:时间回送. 客户机发出请求,服务器响应时间,并返回服务器时间,与客户机进行同步. 废话不多说,下面直接贴出源代码. 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <time.h> #

  • linux下c语言的多线程编程

    我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执行的最小单元. 一般一个最简单的程序最少会有一个线程,就是程序本身,也就是主函数(单线程的进程可以简单的认为只有一个线程的进程) 一个线程阻塞并不会影响到另外一个线程. 多线程的进程可以尽可能的利用系统CPU资源. 1创建线程 先上一段在一个进程中创建一个线程的简单的代码,然后慢慢深入. #incl

  • 深入分析Linux下如何对C语言进行编程

    1.源程序的编译    在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c):  int main(int argc,char **argv)  {printf("Hello Linux/n");  } 要编译这个程序,我们只要在命令行下执行: gcc -o hello hello.c gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello

  • linux下基于C语言的信号编程实例

    本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf("receive si

  • 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

  • linux多线程编程详解教程(线程通过信号量实现通信代码)

    线程分类 线程按照其调度者可以分为用户级线程和核心级线程两种. (1)用户级线程 用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持.在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建.调度.撤销等功能,而内核仍然仅对进程进行管理.如果一个进程中的某一个线程调用了一个阻塞的系统调用,那么该进程包括该进程中的其他所有线程也同时被阻塞.这种用户级线程的主要缺点是在一个进程中的多个线程的调度中无法发挥多处理器的优势.

  • python 网络编程详解及简单实例

    python 网络编程详解 网络编程的专利权应该属于Unix,各个平台(如windows.Linux等).各门语言(C.C++.Python.Java等)所实现的符合自身特性的语法都大同小异.在我看来,懂得了Unix的socket网络编程,其他的形式的网络编程方法也就知道了.这句话说得还不太严谨.准确的应该说成懂得了socket编程的原理,网络编程也就知道了,不同之处就在于每个平台,每个语言都有自己专享的语法,我们直接灵活套用就行了. 下面是用python实现的最基本的网络编程的例子,即依托于客

  • Linux之时钟中断详解

    在Linux的0号中断是一个定时器中断.在固定的时间间隔都发生一次中断,也是说每秒发生该中断的频率都是固定的.该频率是常量HZ,该值一般是在100 ~ 1000之间.该中断的作用是为了定时更新系统日期和时间,使系统时间不断地得到跳转.另外该中断的中断处理函数除了更新系统时间外,还需要更新本地CPU统计数.指的是调用scheduler_tick递减进程的时间片,若进程的时间片递减到0,进程则被调度出去而放弃CPU使用权. 时钟中断的产生 Linux的OS时钟的物理产生原因是可编程定时/计数器产生的

  • linux top命令详解

    top 命令主要用于查看进程的相关信息,同时它也会提供系统平均负载,cpu 信息和内存信息.下面的截图展示了 top 命令默认提供的信息: 系统平均负载 top 命令输出中的第一行是系统的平均负载,这和 uptime 命令的输出是一样的: 13:05:49 表示系统当前时间. up 7 days 表示系统最后一次启动后总的运行时间. 1 user 表示当前系统中只有一个登录用户. load average: 0.01, 0.04, 0.00 表示系统的平均负载,最后的三个数字分别表示最后一分钟的

  • java异步编程详解

    很多时候我们都希望能够最大的利用资源,比如在进行IO操作的时候尽可能的避免同步阻塞的等待,因为这会浪费CPU的资源.如果在有可读的数据的时候能够通知程序执行读操作甚至由操作系统内核帮助我们完成数据的拷贝,这再好不过了.从NIO到CompletableFuture.Lambda.Fork/Join,java一直在努力让程序尽可能变的异步甚至拥有更高的并行度,这一点一些函数式语言做的比较好,因此java也或多或少的借鉴了某些特性.下面介绍一种非常常用的实现异步操作的方式. 考虑有一个耗时的操作,操作

  • python 实现GUI(图形用户界面)编程详解

    Python支持多种图形界面的第三方库,包括: wxWidgets Qt GTK Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里.Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中. wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允

  • R语言基本对象类型知识点详解

    基本向量 包含单类型对象(例如整数,浮点数,复数,文本,逻辑值或者原始型数据)的向量 复合对象 包含一些列基本向量的数据结构,例如列表,配对列表,``S4对象或者环境. 这些对象的特性各不相同,但它们都包含一系列命名的对象 特殊对象 在R编程中服务于特定目的的对象,例如any,NULL和...等. 这类对象在特定的环境中具有十分重要的意义,但是无法创建一个属于该类型的对象 R语言 R代码,其被执行后可以返回其他对象 函数 R的引擎; 其以参数作为输入,同时返回一些对象作为输出 有时候,函数会修改

  • C语言入门之基础知识详解

    一.思维导图 内容不限于此思维导图 二.环境搭建 对于老手,自动跳过这一趴吧,或者也可以看一下我有没有啥纰漏,毕竟小白需要这一趴. 编译器很多,大部分老师会在学生学习C语言的时候推荐使用VC,不带语言提示器的那种,说是可以提高学生的编码能力.我也不知道到底是不是这么一回事儿.我推荐使用VS,这样学的快,函数记不住的问题很严重吗?项目的车轮碾压过去,再记不住也得记住吧!!! 更何况这个系列到后面是会有需要用文本文件编程写项目的阶段. 下载VS2019社区版,不要标新立异选那些最新版的,出了问题到时

  • C语言 sockaddr和sockaddr_in案例详解

    struct sockaddr 和 struct sockaddr_in 这两个结构体用来处理网络通信的地址. 一.sockaddr sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下: struct sockaddr { sa_family_t sin_family;//地址族 char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息 }; 二.sockaddr_

随机推荐