Linux编程手册

本文介绍了Linux编程中编译期宏定义的使用,包括-D选项示例和Makefile配置。此外,详细讲解了字符编码转换,如iconv_open和iconv函数的使用,以及文件I/O、C++11特性、信号处理、GDB调试技巧等Linux编程基础知识。
摘要由CSDN通过智能技术生成

22. 编译期宏定义

选项:-Dmacro[=defn]

示例:

g++ main.cpp -o main -DKURO

Makefile:CXXFLAGS = -std=c++0x -g -Wall -Wno-unused -DKURO=88



21. 转码 


21.1 iconv_open

函数:iconv_t iconv_open(const char *tocode, const char *fromcode);

功能:分配一个转换描述符,用于将字节序列从fromcode编码转换到tocode编码

头文件:#include <iconv.h>

参数:系统支持的fromcode和tocode的合法值及其组合,全部罗列于iconv --list的输出中

返回值:成功则返回转换描述符;失败则返回-1,并置错误码

说明:

① 一个转换描述符iconv_t不可同时用于多个线程

② 转换描述符iconv_t用完后,需调用关闭函数iconv_close()


21.2 iconv

函数:size_t iconv(iconv_t cd,
                    char **inbuf, size_t *inbytesleft,
                    char **outbuf, size_t *outbytesleft);

功能:执行字符集转换

头文件:#include <iconv.h>

参数:

cd 转换描述符

inbuf 指向输入缓冲区首地址的指针

inbytesleft 表示输入缓冲区等待转换的字节个数

outbuf 指向输出缓冲区首地址的指针

outbytesleft 表示输出缓冲区中可用空间大小,字节个数

返回值:成功则返回转换的字符数;失败则返回-1,并置错误码

描述:

① 该函数从*inbuf读取多字节序列,将其转换成目标格式的多字节序列,并将结果存放在*outbuf

② *inbuf中至多*inbytesleft个字节将被读取,至多*outbytesleft个字节将被写入*outbuf

③ 一次转换一个字符,然后根据已转换的输入字节数,递增*inbuf,递减*inbytesleft;根据已转换的输出字节数,递增*outbuf,递减*outbytesleft


21.3 示例


说明:

① 因为iconv会递增*inbuf和*outbuf,因此需要使用临时变量

char *inbuf = (char*)ch;

char *outbuf = buf;

以保证原输入/输出缓冲区指针不变,即ch和buf值不改变。

② 函数执行结束后,inbuf和outbuf的值已改变,不再指向缓冲区首地址,所以获取转换结果,应使用buf,而不是outbuf

③ 转换过程,不会影响输入缓冲区中的原始内容,即ch中的内容不改变



20. 文件I/O


20.1 std::ifstream

打开


读取



20.2 std::ofstream

打开


写入


说明

① std::ofstream::app指定文件打开方式为追加,即从原文件内容的末尾开始写入;默认打开方式为截断,即删除原文件内容

② 文件路径可为绝对路径或相对路径,但不能使用「~」



19. C++11


19.1 shared_ptr

gcc 4.4

头文件:#include <tr1/memory>

使用:std::tr1::shared_ptr<T> shp;

说明:头文件位于目录/usr/include/c++/4.4.7/tr1


gcc 4.8

头文件:#include <memory>

Makefile:CXXFLAGS=-std=c++11

使用:std::shared_ptr<T> shp;


19.2 function与bind

gcc 4.4

头文件:#include <tr1/functional>

使用:std::tr1::function<> fn;    std::tr1::bind(&Class::FnMem, &obj, std::tr1::placeholders::_1);

说明:头文件位于目录/usr/include/c++/4.4.7/tr1


gcc 4.8

头文件:#include<functional>

Makefile:CXXFLAGS=-std=c++11

使用:std::function<> fn; std::bind(&Class::FnMem, &obj, std::tr1::placeholders::_1);


19.3 auto

gcc 4.4

Makefile:CXXFLAGS=-std=c++0x

使用:auto pos = vector.begin();


gcc 4.8

Makefile:-std=c++11

使用:auto pos = vector.begin();



18. SIGPIPE

当一个进程向某个已收到RST的套接字执行写操作时,内核会向该进程发送一个SIGPIPE信号,该信号的默认行为是终止进程

不论进程是捕获了该信号并从其信号处理函数返回,还是简单地忽略该信号,写操作都将返回EPIPE错误


情景还原

现假设数据流向为A——>B

A和B位于两台主机,A发送数据,B给予应答,然后终止进程B


进程终止时,该进程打开的所有描述符都将被关闭,对于套接字描述符,即向对端发送FIN

FIN的作用是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值