十四Linux编程环境

Linux编程环境

时间日期类型

timeval 及其相关API

时间”和“日期”的概念,主要有以下几个:

Coordinated Universal TimeUTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean TimeGMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5

Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。

epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。

clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。

我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能。

 

struct timeval

{

time_t tv_sec; //

susenconds_t tv_usec; //微秒 10 e-6

}

基准计算时间为1970年一月一日 UTC(世界标准时间) 0(Epoch)

time_t表示的时间(日历时间)是从一个时间点(例如:197011000秒)到此时的秒数。在time.h中,我们也可以看到time_t是一个长整型数:

#ifndef _TIME_T_DEFINED
typedef long time_t; /*
时间值 */
#define _TIME_T_DEFINED /*
避免重复定义 time_t */
#endif

大家可能会产生疑问:既然time_t实际上是长整型,到未来的某一天,从一个时间点(一般是197011000秒)到那时的秒数(即日历时间)超出了长整形所能表示的数的范围怎么办?对time_t数据类型的值来说,它所表示的时间不能晚于2038118191407秒。为了能够表示更久远的时间,一些编译器厂商引入了64位甚至更长的整形数来保存日历时间。比如微软在Visual C++中采用了__time64_t数据类型来保存日历时间,并通过_time64()函数来获得日历时间(而不是通过使用32位字的time()函数),这样就可以通过该数据类型保存300111000秒(不包括该时间点)之前的时间。



下面的代码演示了如何获取当前系统时间并转换成字符串:

timeval tv;

gettimeofday(&tv,NULL);

std::cout<<ctime(&tv.tv_sec)<<endl;//将秒数转换成当前时间的字符串表示

tm及其相关API

time(取得目前的时间)

表头文件 #include<time.h>

定义函数 time_t time(time_t *t);

函数说明 此函数会返回从公元197011日的UTC时间从000秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存。

返回值 成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。

 

结构tm的定义为

struct tm

{

int tm_sec//代表目前秒数,正常范围为0-59,但允许至61

int tm_min//代表目前分数,范围0-59

int tm_hour// 从午夜算起的时数,范围为0-23

int tm_mday// 目前月份的日数,范围01-31

int tm_mon// 代表目前月份,从一月算起,范围从0-11

int tm_year// 1900 年算起至今的年数

int tm_wday// 一星期的日数,从星期一算起,范围为0-6

int tm_yday// 从今年11日算起至今的天数,范围为0-365

int tm_isdst// 日光节约时间的旗标

};

示例如下:

time_t sec = time( 0 );//获取当前秒数(UTC)时间

struct tm tmbuf;

localtime_r( &sec, &tmbuf);//将秒数转换成当地时区时间

GCC编译命令

gcc -v 查看版本

 

查找g++的命令帮助 键入 info g++,会显示出gcc的帮助信息,g++大部分参数和gcc命令相同

选项 解释

-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,

例如 asm typeof 关键词。

-c -o只编译并生成目标文件。

-DMACRO 以字符串“1”定义 MACRO 宏。

-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。

-E 只运行 C 预编译器。

-g 生成调试信息。GNU 调试器可利用该信息。

-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY

-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY

-lLIBRARY 连接时搜索指定的函数库LIBRARY

-m486 针对 486 进行代码优化。

-o FILE 生成指定的输出文件。用在生成可执行文件时。

-O0 不进行优化处理。

-O -O1 优化生成代码。

-O2 进一步优化。

-O3 -O2 更进一步优化,包括 inline 函数。

-shared 生成共享目标文件。通常用在建立共享库时。

-static 禁止使用共享连接。

-UMACRO 取消对 MACRO 宏的定义。

-w 不生成任何警告信息。

-Wall 生成所有警告信息。

g++ -o 目标文件名 源文件名

 

ldd programm 查看programm程序所依赖的共享库(.so)文件

ar crv mm.a x.o y.o x.oy.o合并到一个静态库mm.a文件中

ranlib mm.a 生成静态库的内容表 (不是必须)

emacs基本命令

ctrl+x+f 打开文件

ctrl+x+d 打开目录,查看该目录的子目录

ctrl+x+s 保存当前buffer里的文件

ctrl+s 查找当前buffer里的文本

rename-buffer 修改当前缓冲区的名字

ctrl+shift+ - 回退

ctrl+alt+/ 对选中的代码进行格式化

ctrl+x 松开后 按o 在不同的缓冲区移动焦点

alt+x选中命令缓冲区

ctrl+g取消当前命令

 

alt+w 复制被选中的代码

ctrl+y 粘帖代码

ctrl+w 剪切代码

ctrl+x 松掉后按backspace 设置断点

ctrl+x+k 关闭当前缓冲区

 

 

GDB调试命令

查看gdb帮助信息 gdb –help

 

注意g++编译时,使用-g命令

gdb 已编译的程序文件名

list 显示源代码

 

break命令设置断点,可以后面加上函数名称

delete breakpoints 删除所有断点

run 运行程序

step <count> 单步跟踪(自动进入函数)

next <count> 单步跟踪(不自动进入函数)

continue 继续运行

 

print 变量名查看某变量的值,调试过程中改变某变量的值

info breakpoints 查看程序中断点设置的信息

quit 退出

 

info thread 列出多个线程号。 thread 查看当前线程号 thread 线程号 选择进入哪个线程进行调试。

 

UnicodeMultiBytes 字符串的转换

#include <wchar.h>

size_t wcsrtombs (char *dest, const wchar_t **src, size_t len, mbstate_t *ps);

 

#include <stdlib.h>

size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n);

 

环境变量

查看环境变量

env

 

env也可以用来设置环境变量的值,具体看env --help

 

set 也可是设置环境变量

如果环境变量在一个terminal里设置,就只对这个terminal有效

 

如果想全局的设置,需要修改

/etc/profile文件

你可能感兴趣的:(linux)