
C/C++
luciusvorenus
因为热爱,所以细心、认真并保持一颗敬畏之心!
展开
-
动态库(共享库)的制作和使用
Linux下的动态库为lib*.so格式的二进制文件(目标文件),对应于Windows下的.dll格式的文件。(1)命名规则lib+库名+.so(2)动态库的制作1)生成与位置无关的代码(.o) 2)将.o文件打包成动态库(共享库) 仍然以上篇文章的代码为例。[root@localhost src]# gcc -fPIC -c *.c[root@loc...原创 2019-03-14 01:10:51 · 3084 阅读 · 1 评论 -
静态库的制作和使用
Linux下的静态库为lib*.a格式的二进制文件(目标文件),对应于Windows下的.lib格式的文件。(1)命名规则 lib+库名字+ .a libMytest.a ,则库名字为mytest。下面以具体的代码为例介绍如何制作静态库。//main.c#include <stdio.h>#include "head.h" int ...原创 2019-03-12 21:18:59 · 7691 阅读 · 0 评论 -
link、symlink、readlink、unlink函数的使用
#include <unistd.h>int link(const char *oldpath, const char *newpath);作用:创建一个硬链接 0成功 -1 失败//代码#include <stdio.h>#include <stdlib.h>#include <unistd.h>int ma...原创 2019-03-21 00:15:13 · 1590 阅读 · 0 评论 -
truncate、rename函数的使用
#include <unistd.h>#include <sys/types.h>int truncate(const char *path, off_t length);int ftruncate(int fd, off_t length);作用:用于拓展或截断文件。将参数path 指定的文件大小改为参数length 指定的大小。如果原来的文件大小比参数l...原创 2019-03-21 00:13:50 · 386 阅读 · 0 评论 -
chmod、chown函数的使用
#include <sys/stat.h>int chmod(const char *path, mode_t mode);int fchmod(int fd, mode_t mode);作用:改变指定文件的权限。第二个参数:mode必须为一个8进制数;返回值为0表示成功,-1表示失败。//代码#include <stdio.h>#include &...原创 2019-03-21 00:12:30 · 969 阅读 · 0 评论 -
access、strtol函数的使用(后者为C库函数)
#include <unistd.h>int access(const char *pathname, int mode);作用:检查调用该函数的进程是否可以对指定的文件执行某种操作。第一个形参:文件名;第二个形参:R_OK(是否可读)、W_OK(是否可写)、X_OK(是否可执行)、F_OK(文件是否存在);返回值:0表示拥有所查的权限(即符合该权限)、-1(未通过所查询的...原创 2019-03-21 00:10:37 · 234 阅读 · 0 评论 -
makefile中的两个函数(wildcard和patsubst)
(1) wildcard函数作用是查找指定目录下指定类型的文件,并最终返回一个环境变量,需要用$取值赋值给另一个环境变量!该函数只有一个参数,如取出当前目录下的所有.c文件,并赋值给allc普通变量:allc=$(wildcard ./*.c)。(2) patsubst函数作用是更换文件的后缀格式,共有三个参数。如将allc的所有.c的文件更换为.o的文件:allo=$(pats...原创 2019-03-17 03:06:31 · 2973 阅读 · 0 评论 -
makefile的两个变量(自动变量和普通变量)
(1)普通变量如:obj=main.o add.o sub.o mul.o div.o //将后面的值赋值给obj,obj就是一个普通变量target=zsx //将zsx赋值给targetmakefile中已经定义的一些普通变量(通常格式都是大写,类似环境变量,它们都是普通变量,直接赋值即可,任意类型皆可):CC,其值为gcc或cc(cc就是gcc,完全等价),且用户还可以修改...原创 2019-03-17 01:47:33 · 1274 阅读 · 0 评论 -
makefile文件的书写规则(make和makefile)
对于makefile,掌握一个规则,两个变量和三个函数。下面介绍一个规则。makefile的作用:一个项目代码的管理工具。当一个项目的代码文件数(如.c文件)太多,用gcc编译会太麻烦,如果全部文件一次性编译,一个文件有错误,所有文件都需要重新编译。如果每个文件单独编译,则十分麻烦。因此,就有项目代码管理工具makefile。项目代码编译管理;节省编译项目的时间;一次编写,终身受益。[ro...原创 2019-03-17 00:39:50 · 1915 阅读 · 0 评论 -
目录操作相关的系统函数
主要介绍几个常用函数的使用方法:chdir(改变进程的当前工作目录)、getcwd(获取当前进程的工作目录)、mkdir(创建目录)、rmdir(删除空目录)、opendir(打开一个目录)、readdir(读目录)、closedir(关闭目录)。后三个函数常常用到!另外,介绍几个常用的字符串函数:strcmp和sprintf函数。#include <string.h>in...原创 2019-03-21 12:43:17 · 218 阅读 · 0 评论 -
虚拟地址空间
对于每一个进程都会对应一个虚拟地址空间,对于32位的操作系统(其指令的位数最大为32位,因此地址码最多32位),虚拟地址空间的大小为B即0~4GB的虚拟地址空间,其中内核空间为1GB,如下所示: 每一个进程的进程控制块PCB都位于内核区,在每一个进程的PCB中有一个文件描述符表(是一个数组),用于标记该进程所打开的所有文件。从文件描述符表可以看出每一个进程最...原创 2019-03-13 03:32:18 · 15822 阅读 · 5 评论 -
open函数和errno全局变量
(1)open函数man man 查看man文档的首页 其中DESCRIPTION部分描述了man文档的每一章的章节内容 第2章System calls为系统调用,即Liunx系统函数。 man 2 open 查看第二章的open函数的详细帮助文件。open函数用于打开一个已经的文件或者创建一个没有的文件,其详细描述如下:#include <sys/types.h>...原创 2019-03-18 19:00:28 · 2556 阅读 · 0 评论 -
fcntl函数(网络编程会用)
#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);//long 长整型int fcntl(int fd, int cmd, struct flock *lock);可见fcntl函数是一个可变参数函数(函...原创 2019-03-21 22:51:48 · 813 阅读 · 0 评论 -
dup和dup2函数
#include <unistd.h>int dup(int oldfd);int dup2(int oldfd, int newfd);作用:dup函数实现对一个文件的文件描述符进行复制,复制之后该进程就会新增加一一个文件描述符指向该文件(即实现同一个文件对应多个文件描述符)。dup2函数:如果new是一个被打开的文件描述符(与old不是同一个文件),则在拷贝前先关闭ne...原创 2019-03-21 22:50:51 · 482 阅读 · 0 评论 -
opendir、readdir和closedir函数
注意:在Linux中,目录的输入格式:/mnt//fghs、/mnt/fghs、/mnt/fghs和/mnt/fghs//是等效的,都一样。#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);DIR *fdopendir(int fd);返回值:出错返回NULL,...原创 2019-03-21 17:32:47 · 2081 阅读 · 0 评论 -
chdir、getcwd、mkdir、rmdir函数
#include <unistd.h>int chdir(const char *path);int fchdir(int fd);作用:改变调用这一函数的进程(即程序执行)的当前工作目录,注意不是shell的当前工作目录。返回值:0成功 -1失败#include <unistd.h>char *getcwd(char *buff, size...原创 2019-03-21 17:31:03 · 660 阅读 · 0 评论 -
C库函数与Linux系统函数之间的关系
由上小节知道,C库函数是借助FILE类型的结构体来对文件进行操作的,其本身只是在用户空间(I/O缓冲区)进行读写操作,而数据在内核与用户空间之间的传递、以及将内核与I/O设备之间的数据传递都是该C库函数进行一系列的系统调用来完成的。每一个C库函数(接口函数,API)对应的是一个或多个系统调用。 下图以printf函数为例。printf是标准输出流的输出函数(其文件...原创 2019-03-18 03:16:36 · 583 阅读 · 0 评论 -
C库函数
Linux的系统I/O函数(read、write、open、close和 lseek等)与C语言的C库函数(libc.so库文件中)都是相对应的,它们都是动态库函数。如下图所示,C库函数有fopen、fclose、fwrite、fread和fseek等。这些C库函数都封装在libc.so库文件中,其中的fopen函数用于打开一个文件,其返回值为FILE *类型(指向FILE类型的一...原创 2019-03-18 03:15:24 · 1328 阅读 · 1 评论 -
C/C++中NULL指针
先谈一下C/C++的强制类型转换Type cast。与强制类型转换相对应的是自动类型转换。或者强制类型转换叫显示类型转换,自动类型转换叫隐式类型转换。自动类型转换会在赋值运算、混合运算、参数传递、返回函数返回值、格式化输出时且当类型出现不一致时发生,转换按数据长度增加的方向进行。 如果不希望一个类型按照自动类型转换的原则发生变化,就需要使用强制类型转换。 C的强...原创 2019-03-13 03:57:11 · 632 阅读 · 0 评论 -
stat函数(stat、fstat、lstat)
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h> //需包含头文件有如下三个函数的函数原型:int stat(const char *path, struct stat *buf);第一个形参:指出文件(文件路径); 第二个形参:出参数(函数对该参数操作,然后...原创 2019-03-20 18:26:33 · 5549 阅读 · 2 评论 -
文件操作相关的系统函数
重点学习:stat(fstat、lstat 获取文件属性)、access(测试指定文件是否拥有某种权限)、chmod(改变文件的权限)、chown(改变文件的所属主和所属组)、truncate(截断或拓展文件)、link(创建硬链接)、symlink(创建软链接)、readlink(读软链接对应的文件名,即软链接本身的内容,文件路径)、unlink(删除符号链接、硬链接数减1、临时文件关闭时自删除...原创 2019-03-20 18:21:59 · 185 阅读 · 0 评论 -
全缓冲、行缓冲和无缓冲
这里的缓冲是指的是用户空间的I/O缓冲区,不是内核缓冲。无缓冲:用户层不提供缓冲,数据流直接到内核缓冲,再到磁盘等外设上。标准错误输出(2)通常是无缓存的,因为它必须尽快输出,且是输出到具有交互式的设备上,如屏幕,不是磁盘。行缓冲:在I/O缓冲区中遇到换行符或者缓冲区写满时,就自动把数据送到内核缓冲区标准输入(0)和标准输出(1)对应终端设备时通常是行缓冲的。另外,在程序结束时;main函...原创 2019-03-19 17:04:13 · 1004 阅读 · 0 评论 -
gcc编译器与g++编译器的区别
gcc与g++编译器的程序文件分别为:/usr/bin/g++和/usr/bin/gcc。 gcc 和 GCC 是两个不同的东西,GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。gcc是GCC中的GUN C Compiler(C 编译器);g+...原创 2019-03-10 03:26:46 · 830 阅读 · 0 评论 -
宏定义对调试代码的作用
以如下代码为例://head.h #ifndef __HEAD_H__#define __HEAD_H__#define NUM1 10#define NUM2 20#endif//sum.c#include <stdio.h> //直接在标准库中查找#include "head.h" //...原创 2019-03-10 02:37:35 · 342 阅读 · 0 评论 -
gcc编译器的整个工作过程
gcc hello.c ./a.out 或者 gcc hello.c -o hello ./hello./表示执行当前目录下的可执行程序或脚本程序。首先gcc需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着gcc会调用编译程序ccl和汇编程序as将处理后的源代码编译成目标代码;最后,gcc会调用链接程序ld,把...原创 2019-03-10 02:26:43 · 1236 阅读 · 0 评论 -
gcc与g++编译器
首先在Linux(RHEL7.0)上安装gcc:yum install gcc gcc-c++ -y 其中gcc-c++是为了能够编译c++源代码,即g++。 gcc为Linux C/C++下重要的编译环境,是GUN项目中符合ANSIC标准的编译系统, gcc可以编译C、C++、Objective-C、Java、Fortran、Pascal等多种语言,而且gc...原创 2019-03-09 23:55:31 · 244 阅读 · 0 评论 -
gdb调试器(二)
Linux下的gdb(GNU Debugger)是一个用来调试C、C++程序的调试器(命令行方式的调试器),能够在程序运行期间观察程序的内部结构和内存的使用情况。程序员也可以使用gdb来跟踪程序中的错误,从而减少程序员的工作量。gdb主要提供以下功能:设置断点(断点可以是条件表达式),使程序在指定的代码行上暂停执行,便于观察; 单步执行程序,便于调试; 查看程序中变量值的变化; 动态改变...原创 2019-03-15 23:22:09 · 179 阅读 · 0 评论 -
gdb调试器(一)
在默认情况下,gcc在编译时不会把调试符号插入到最终生成的二进制代码(机器代码)中,因为这样会急剧增加可执行程序的大小。如果需要在编译时生成调试符号的信息,则可以采用-g或-ggdb参数。gcc在产生调试信息时,同样采用了分级的思路(-g1,-g2,-g3),默认的级别是-g2,此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息。级别-g3包含级别-g2的信息,另外还有源代码中定义的...原创 2019-03-14 01:37:35 · 585 阅读 · 0 评论 -
管道 -pipe
gcc编译器将源代码编译成可执行程序的过程中,需要经过许多中间步骤(预处理、编译、汇编、链接),这些过程实际上是由不同的程序来负责完成的(/usr/bin/gcc、cpp、ccl、as和ld等)。在这个过程的每一个阶段中,都会生成一个临时文件,因此会增加系统资源的开销,导致速度变慢。可以通过管道来解决这一问题。管道实质上就是进程间的通信方式,它可以用来同时连接两个程序(进程),其中一个程序的输...原创 2019-03-14 01:15:32 · 426 阅读 · 0 评论 -
read和write函数的使用
都需要包含头文件: <unistd.h>read系统函数从打开的设备或文件中读取数据,即将数据从外设上经过内核读到用户空间;write系统函数相反,向打开的设备或文件中写入数据,即将数据从用户空间(I/O缓冲)送到内核,然后刷到外设上。它们的函数原型如下:ssize_t read(int fd, void *buf, size_t count); ssize_t为有符号...原创 2019-03-19 17:06:42 · 19551 阅读 · 1 评论 -
lseek函数的使用
需要包含头文件:<sys/types.h> <unistd.h>off_t lseek(int fd, off_t offset, int whence); 函数原型函数功能:移动文件读写指针;获取文件长度;拓展文件空间。在使用该函数之前需要将文件打开! off_t 有符号整型 fd为文件描述符 offset参数指定偏移量 whence参数指定具...原创 2019-03-19 17:08:08 · 2071 阅读 · 0 评论 -
gcc编译多个源代码文件的过程(引出makefile)
由foo1.c foo2.c foo3.c 3个源文件组成的源程序生成最终的可执行程序foo的命令:gcc foo1.c foo2.c foo3.c -o foo如果处理的源文件不止一个,则gcc会依次对每个文件进行预处理、编译、汇编,最后将所有的目标代码和库文件进行,链接生成可执行程序。即等价于以下步骤:gcc -c foo1.c -o foo1.ogcc -c foo2.c -...原创 2019-03-12 00:03:07 · 736 阅读 · 0 评论 -
gcc的优化功能
代码优化的目的是改善程序的执行性能。gcc提供的代码优化功能非常强大,它通过参数-On来控制优化代码的生成,其中n为优化级别的整数,比较典型的范围是从0变化到2或3(与版本有关)。编译时通过使用选项-O可以告诉gcc同时减小代码的长度和执行时间,其效果等价于-O1,在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转和延迟退栈两种优化。选项-O2除了完成所有-O1级别的优...原创 2019-03-11 23:51:11 · 1458 阅读 · 1 评论 -
gcc的警告提示信息
gcc包含完整的出错检查和警告提示功能。采用-pedantic选项,对于不符合ANSI/ISO标准的源代码会产生相应的警告信息。如:gcc -pedantic hello.c -o hello (main函数返回类型为int,且函数体内要有return 语句,一般为 return 0;) -pedantic不能保证被编译的程序与ANSI/ISO C语言标准的完全兼容,只能帮助Linux程序员离这...原创 2019-03-11 23:48:34 · 1105 阅读 · 0 评论 -
剖析数组名、函数名(不是指针常量,更不是指针)
对于一个数组,如 int a[4]; 如果只是给出数组名a,编译器不知道该取该数组的第几个元素,因此编译器不会自动取值,而是返回该数组的首地址(第一个元素的地址)。其实,数组名a就是数组本身,并不是数组的首地址,只是当只是给出了数组名a的时候,而又同时需要取值时,数组名a才会被隐式转换为该数组的首地址。因此,int *p=&a;和int *p=a的效果是一样的,只是前者是...原创 2019-03-11 22:59:19 · 700 阅读 · 1 评论 -
gdb调试器(三)
File/file 装入想要调试的可执行文件 run(r) 执行当前被调试的程序 kill(k) 终止正在调试的程序 quit(q) 退出gdb shell 使用户不离开gdb就可以执行Linux的shell命令 backtrace(bt) 回溯跟踪(当对代码进行调试时,run后出现错误,则可以使用bt命令查出详细...原创 2019-03-16 01:01:46 · 406 阅读 · 0 评论 -
C命令行参数
C命令行参数的作用是在执行程序时,可以将命令行的参数传值给C程序内部,这样就可以从外部控制程序,而不是在代码内对这些值进行硬编码。命令行参数是使用main函数来处理的,argc是指参数的个数,为int类型;argv[ ]为一个字符串,即char *类型,将该字符串的首地址赋值给字符指针argv[ ],因此argv[ ] 表示一个字符串(其实这是一种隐式转换,具体的理解可以看之前的文...原创 2019-03-11 11:49:54 · 298 阅读 · 0 评论 -
gcc的常用参数
-c 编译成目标文件.o(只编译不链接) gcc -c hello.s -o hello.o-o 指出输出文件名,输出文件名跟在-o后面。如果不使用这一选项,则缺省的输出文件名为a.out。gcc hello.c -o hello.exe(在Linux中该项后缀名无要求) ./hello.exe gcc hello.c 则最终输出的文件名为a.out 其次-o参数在...原创 2019-03-11 01:34:23 · 257 阅读 · 0 评论 -
库文件与头文件
首先说明库文件与头文件在gcc中的具体使用方法,然后说明两者的区别与联系。 库文件即库函数,如printf和scanf函数。以libgtdf.so库文件为例(库文件在命名时都以lib开头,因此使用-l选项去链接指定的库文件时可以省略lib三个字母,即-lgtdf),一般库文件如果是放在/lib,/usr/lib,/usr/local/lib目录(库文件的默认目录)...原创 2019-03-11 01:22:25 · 3209 阅读 · 0 评论 -
open函数和close函数的使用
学习几个常用的Linux系统I/O函数:open、close、write、read和lseek。注意,系统调用函数必须都考虑返回值。(1)open函数的使用首先,需要包含三个头文件:<sys/types.h> <sys/stat.h> <fcntl.h>以如下代码为例:[root@localhost src]# lsadd.c di...原创 2019-03-18 19:08:58 · 3613 阅读 · 0 评论