C语言编程
文章平均质量分 84
尹成
尹成微信18510341407,助理微信18514203048
展开
-
Linux系统编程(3)——文件与IO之fcntl函数
linux文件I/O用:open、read、write、lseek以及close函数实现了文件的打开、读写等基本操作。fcntl函数可以根据文件描述词来操作文件。 用法:int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct flock*lock); 参数:原创 2014-07-24 14:52:00 · 1870 阅读 · 0 评论 -
Linux系统编程(4)——文件与IO之ioctl函数
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的参数个数如下:int ioctl(int fd, int cmd, …);其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd原创 2014-07-24 14:52:31 · 2873 阅读 · 0 评论 -
Linux系统编程(7)—— 进程之进程概述
我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。现在我们全面了解一下其中都有哪些信息。 进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。进程的状态,有运行、挂起、停止、僵尸等状态。进程切换时需要保存和恢复的一些CPU寄存器。描述虚拟地址空间的信息。描述控制终端的信息。当原创 2014-07-24 14:58:49 · 2161 阅读 · 0 评论 -
C语言的本质(34)——静态库
库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通常把库文件存放在/usr/lib或/lib目录下。Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so最为后缀,静态链接库通常以.a作为后缀。在程序中使用使用静态库和动态库时,他们载入的顺序是不同的。静态库的代码原创 2014-07-24 13:29:57 · 1631 阅读 · 0 评论 -
C语言的本质(35)——共享库
库用于将相似函数打包在一个单元中。然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法— 即,从模块中构建程序。Linux支持两种类型的库,每一种库都有各自的优缺点。静态库包含在编译时静态绑定到一个程序的函数。动态库则不同,它是在加载应用程序时被加载的,而且它与应用程序是在运行时绑定的。 使用共享库的方法有两种:您既可以在运行时动态链接库,也可以动态加载库并在程序控制之下使用它们。本原创 2014-07-24 13:31:21 · 1915 阅读 · 0 评论 -
C语言的本质(36)——makefile基础
除了Hello World这种极简单的程序之外,一般的程序都是由多个源文件编译链接而成的,这些源文件的处理步骤通常用Makefile来管理。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令C语言首先要把源文件编原创 2014-07-24 13:57:12 · 1961 阅读 · 0 评论 -
C语言的本质(38)——makefile之变量
我们详细看看Makefile中关于变量的语法规则。先看一个简单的例子:foo = $(bar) bar = Huh? all: @echo$(foo)我们执行make将会打出Huh?。当make读到foo = $(bar)时,确定foo的值是$(bar),但并不立即展开$(bar),然后读到bar = Huh?,确定bar的值是Huh?,然后在执行规则all:的命令列表时才需要展开$(f原创 2014-07-24 13:59:08 · 1926 阅读 · 0 评论 -
Linux系统编程(1)——文件与I/O之C标准I/O函数与系统调用I/O
Linux系统的I/O也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于Linux平台。而标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含原创 2014-07-24 14:00:45 · 4575 阅读 · 0 评论 -
Linux系统编程(6)——文件系统
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自原创 2014-07-24 14:56:24 · 1961 阅读 · 0 评论 -
Linux系统编程(5)——文件与IO之mmap函数
mmap系统调用它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,mmap()实现共享内存也是其主要应用之一。mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。我们的程序中大量原创 2014-07-24 14:52:54 · 2059 阅读 · 0 评论 -
C语言入门(20)——使用VC2013对C语言进行调试
C语言入门(20)——使用VC2013对C语言进行调试原创 2014-06-30 12:29:30 · 4141 阅读 · 1 评论 -
C语言入门(21)——使用DBG对C语言进行调试
C语言入门(21)——使用DBG对C语言进行调试原创 2014-06-30 12:30:00 · 8780 阅读 · 1 评论 -
C语言的本质(5)——类型转换的本质与处理
C语言的本质(5)——类型转换的本质与处理原创 2014-06-30 12:47:37 · 4016 阅读 · 0 评论 -
C语言的本质(10)——指针本质
指针,大概是C语言中最难理解的概念之一了。指针这个东西是C语言中的一个基本概念,C99中对于指针的定义是:1. 指针的类型是derived from其它类型,也就是说指针的类型是由它指向的类型决定的;2. 指针是一种reference类型,即引用类型; 指针这个词出现在高级语言程序设计中,在汇编中,就没有指针这个概念,有的只是地址。计算机的每一个内存单元都是编址的,对内存的访问都是通过地址进行的原创 2014-06-30 13:08:17 · 8311 阅读 · 0 评论 -
C语言的本质(31)——C语言与汇编之函数调用的本质
我们一段代码来研究函数调用的过程。首先我们写一段简单的小程序: int sum(int c, int d){ inte = c + d; returne;} int func(int a, int b){ returnsum(a, b);} int main(void){ func(2,3); return0;} 通原创 2014-07-24 13:22:05 · 1847 阅读 · 1 评论 -
C语言的本质(32)——C语言与汇编之C语言内联汇编
用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码。另外,有些平台相关的指令必须手写,在C语言中没有等价的语法,因为C语言的语法和概念是对各种平台的抽象,而各种平台特有的一些东西就不会在C语言中出现了,例如x86是端口I/O,而C语言就没有这个概念,所以in/out指令必须用汇原创 2014-07-24 13:26:58 · 2746 阅读 · 0 评论 -
C语言的本质(33)——GCC编译器入门
GCC(GNU CompilerCollection,GNU编译器套装),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统采纳为标准的编译器,GCC同样适用于微软的Windows。GCC是自由软件过程发展中的著名例子,由自由软件基金会以GPL协议发布。GCC是Linux平台下原创 2014-07-24 13:28:07 · 1924 阅读 · 0 评论 -
C语言的本质(37)——makefile之隐含规则和模式规则
Makefile有很多灵活的写法,可以写得更简洁,同时减少出错的可能。本节我们来看看这样一个例子还有哪些改进的余地。 一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写,例如: main.o: main.h stack.h maze.h main.o: main.c gcc-c main.c就相当于: main.o: main.c main.h stack.h maze.原创 2014-07-24 13:57:58 · 2761 阅读 · 0 评论 -
Linux系统编程(2)——文件与IO之系统调用与文件IO操作
系统调用是指操作系统提供给用户程序的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得得操作系统内核提供的特殊服务。在linux中用户程序不能直接访部内核提供的服务。为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间,他们运行在不同的级上,在逻辑上是相互隔离的。在linux中用户编程接口(API)遵循了在UNIX中最流行的应用编程界面标准——POSIX标准。这些系统调用编程接口主原创 2014-07-24 14:03:13 · 1987 阅读 · 0 评论 -
Linux系统编程(8)—— 进程之进程控制函数fork
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 函数原型#include#include pi原创 2014-07-25 23:28:53 · 1889 阅读 · 0 评论 -
Linux系统编程(20)——信号基本概念
信号及信号来源信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附原创 2014-07-26 11:07:03 · 2006 阅读 · 0 评论 -
Linux系统编程(21)——信号的产生
1、通过终端按键产生信号通过上一篇我们知道了SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,现在我们来验证一下。 首先解释什么是Core Dump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检原创 2014-07-26 11:07:18 · 2158 阅读 · 0 评论 -
Linux系统编程(24)——信号的生命周期
信号生命周期为从信号发送到信号处理函数的执行完毕。对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。相邻两个事件的时间间隔构成信号生命周期的一个阶段。下面阐述四个事件的实际意义:1、信号"诞生"。信号的诞生指的是触发信号的事件发生(如检测到硬件异原创 2014-07-26 11:11:29 · 2900 阅读 · 0 评论 -
Linux系统编程(19)——正则表达式在sed和awk中的使用
sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。sed和vi都源于早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。 sed命令行的基本格式为 sed option 'script' file1 file2 ...sed option -原创 2014-07-26 11:06:29 · 1840 阅读 · 0 评论 -
Linux系统编程(22)——响应信号
进程对信号的响应进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作。注意,进程对实时信号的缺省反应是进程终止。Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。原创 2014-07-26 11:07:37 · 2284 阅读 · 0 评论 -
Linux系统编程(23)——信号的阻塞
实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的: 每个信号都有两个标志位分别表示阻原创 2014-07-26 11:10:50 · 2267 阅读 · 0 评论 -
传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)
卷 backup 的文件夹 PATH 列表卷序列号为 000000F4 D4A8:14B0J:.│ 1.txt│ 2.txt│ ├─1传智播客_尹成_C语言从菜鸟到高手_第一章C语言概述A│ ├─文档│ │ 第1讲 C语言第一阶段.doc│ │ │ └─视频│ 第1讲 C语言第一阶段.mp4│ ├─2传智播客_尹成_C语言从原创 2014-10-06 07:30:29 · 13329 阅读 · 35 评论 -
Linux系统编程(18)——正则表达式实用举例
匹配特定字符串:只能输入长度为3的字符:"^.{3}$"。只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。原创 2014-07-26 11:08:43 · 2183 阅读 · 0 评论 -
Linux系统编程(17)——正则表达式进阶
C的变量和Shell脚本变量的定义和使用方法很不相同,表达能力也不相同,C的变量有各种类型,而Shell脚本变量都是字符串。同样道理,各种工具和编程语言所使用的正则表达式规范的语法并不相同,表达能力也各不相同,有的正则表达式规范引入很多扩展,能表达更复杂的模式,但各种正则表达式规范的基本概念都是相通的。如果要用grep查找一个模式,如何表示这个模式,这一类字符串,而不是一个特定的字符串呢?从这两个原创 2014-07-26 11:05:42 · 1931 阅读 · 0 评论 -
Linux系统编程(9)—— 进程之进程控制函数exec系列函数
在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是:#include extern char **environ;int execl(const char *path, const char*arg, ...);int execlp(const char *file, const char*arg, ...);int execle(const char *path原创 2014-07-25 23:29:25 · 2338 阅读 · 0 评论 -
Linux系统编程(14)——shell常用命令
1. ls命令 ls命令是列出目录内容(ListDirectory Contents)的意思。运行它就是列出文件夹里的内容,可能是文件也可能是文件夹。 “ls -l”命令已详情模式(longlisting fashion)列出文件夹的内容。 “ls -a”命令会列出文件夹里的所有内容,包括以”.”开头的隐藏文件。注意:在Linux中,文件以“.”开头的就是隐藏文件,并且每个文件,文件夹,设备或者命原创 2014-07-25 23:34:18 · 1929 阅读 · 0 评论 -
LLinux系统编程(10)——进程间通信之管道
管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。有名管道叫named pipe或者FIFO(先进先出)。 管道具有以下特点:1、管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;2、只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);3、原创 2014-07-25 23:30:48 · 1896 阅读 · 0 评论 -
Linux系统编程(11)——进程间通信之有名管道
Linux系统编程(11)——进程实例 管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程原创 2014-07-25 23:31:25 · 1920 阅读 · 0 评论 -
Linux系统编程(12)——shell基础
Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要原创 2014-07-25 23:31:49 · 1939 阅读 · 1 评论 -
Linux系统编程(13)——Shell的基本语法
按照惯例,Shell变量由全大写字母加下划线组成,有两种类型的Shell变量:环境变量和本地变量。 环境变量:环境变量可以从父进程传给子进程,因此Shell进程的环境变量可以从当前Shell进程传给fork出来的子进程。用printenv命令可以显示当前Shell进程的环境变量。 本地变量只存在于当前Shell进程,用set命令可以显示当前Shell进程中定义的所有变量(包括本地变量和环境变量)和原创 2014-07-25 23:32:52 · 1836 阅读 · 0 评论 -
Linux系统编程(15)——shell脚本语法
Shell字符串字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。单引号 str='this is a string'单引号字符串的限制:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号字串中不能出现单引号(对单引号使用转义符后也不行)。双引号your_nam原创 2014-07-25 23:37:09 · 2157 阅读 · 0 评论 -
Linux系统编程(16)——正则表达式入门
字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件。 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则原创 2014-07-26 11:02:51 · 1958 阅读 · 0 评论 -
C语言入门(2)——安装VS2013开发环境并编写第一个C语言程序
在C语言入门系列中,我们使用Visual studio 2013 Professional作为开发工具。本篇详细介绍如何安装Visualstudio 2013 Professional并写出我们第一个C程序。 1、工具准备开发机环境:Win7或以上版本操作系统,Internet Explorer 10(IE10)或以上版本。建议安装IE11。在线安装包下载地址:http://windows.mic原创 2014-06-22 17:14:57 · 13551 阅读 · 1 评论 -
C语言入门(8)——形参与实参
对于带参数的函数,我们需要在函数定义中指明参数的个数和每个参数的类型,定义参数就像定义变量一样,需要为每个参数指明类型,并起一个符合标识符命名规则的名字。例如: #include void print_time(inthour,intminute,intsecond){ printf("%d:%d:%d\n", hour,minute,second);} int main(voi原创 2014-06-24 23:48:56 · 3404 阅读 · 0 评论 -
C语言的本质(16)——函数接口的传入参数与传出参数
如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcpy(char *dest, const char *src);其中src参数是传入参数,dest参数是传出参数。有些函数的指针参数同时担当了这两种角色,如select函数。其函数原型为:int sel原创 2014-07-17 15:31:51 · 9373 阅读 · 0 评论