应用编程#c语言的日期时间
0x01 时间函数之间的关系

| |

| |
函数错误码。
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| UNIX环境高级编程 第3版 | 9787115516756 | [美]W.理查德·史蒂文斯 | 人民邮电出版社 | 2019年10月 | P |
| UNIX编程艺术 | 9787121176654 | [美]埃瑞克.S.理曼德 | 电子工业出版社 | 2021年02月 | |
| Linux高性能服务器编程 | 9787111425199 | 游双 | 机械工业出版社 | 2013年06月 | P |
Shell编程中常用的文件描述符有3个:
0:stdin,标准输入,默认指的是键盘输入
1:stdout,标准输出,默认指的是屏幕输出
2:stderr,标准错误输出,默认值得是屏幕输出
本文记录shell脚本读取文件的方法。
本文记录学习研究JVM所用的参考图书和资料。
本文记录学习和研究Spring所需的参考图书和资料。
本文记录学习Java使用到的图书以及相关网站。
简单介绍STL对集合操作有标准的算法:
针对这里提及的四个集合运算必须特别注意:
- 1、第一个算法需保证第一集合和第二集合有序,并从小到大排序,内部使用默认“<”操作符比较元素大小;
- 2、第二个算法需保证第一集合和第二集合有序,排序方式参照Compare确定,内部使用Compare比较元素大小。
在C++11之前,要实现函数对象或者仿函数,主要参考《C++设计新思维》中的Loki库,它采用模板推导的方式来实现。虽然Loki可以模拟函数对象,但其代码看起来比较晦涩,使用又不方便。在C++11以后,开始原生支持函数对象,新标准中的用法简单清晰,所有的可调用对象有了统一的调用方式,极易上手。本文总结函数对象的各种使用方法。
std::call_once的使用方法。
本文记录现代C++使用到的图书以及相关网站。
https://zh.cppreference.com/w/cpp/11
https://zh.cppreference.com/w/cpp/14
https://zh.cppreference.com/w/cpp/17
https://zh.cppreference.com/w/cpp/20
https://zh.cppreference.com/w/cpp/23
https://zh.cppreference.com/w/cpp/26
我们首先看下面的这个例子,它可编译也可执行,最终结果是“TDemo::print 55”。有理由推断,实例化一个对象时,编译器自动将55这个整数转换成了“class TDemo”。类TDemo定义了一个单参数构造函数,而C++标准中,“单参数构造函数,可以完成从形参到该类型的一个隐式转换”,所以编译器能够完成从int类型到TDemo的类型转换。
| |
强制类型转换关闭或挂起了正常的类型检查。强烈建议避免使用强制类型转换,不依赖类型转换也能写出很好的C++程序。
这个建议在如何看待 reinterpret_cast 的使用时非常重要。此类强制转换总是非常危险的。相似地,使用价格const_cast也总是预示着设计权限。设计合理的系统应不需要使用强制转换抛弃const特性。其他的强制转换,如static_cast和dynamic_cast,各有各的用途,但都不应频繁使用。每次使用强制转换前,程序员应该仔细考虑是否还有其他不同的方法可以达到同一目的。如果非强制转换不可,则应限制强制转换值的作用域,并且记录所有假定涉及的类型,这样能减少错误发生的机会。
导语:C++中用“虚”的来命名的概念,涉及:
本文简要的说明下在面临什么样的问题下使用相应的技术、这些概念又是如何解决问题的。
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| C++ Primer 中文版 第5版 | 9787121155352 | [美]李普曼 | 电子工业出版社 | 2013-09-01 | P |
| C++ Templates 第2版 中文版 | 9787115601513 | [美]范德沃德,约祖蒂斯 | 人民邮电出版社 | 2024-01-01 | |
| C++ Templates 第2版 英文版 | 9787121155352 | [美]范德沃德,约祖蒂斯 | 人民邮电出版社 | 2018-05-01 | P |
| C++ Templates 中文版 | 9787115479938 | [美]范德沃德,约祖蒂斯 | 人民邮电出版社 | 2013-04-01 | P |
| 深入应用C++11:代码优化与工程级应用 | 9787111500698 | 祁宇 | 机械工业出版社 | 2015-05-01 | P,JV |
| 深入理解C++11:C++ 11新特性解析与应用 | 9787111426608 | Michael Wong | 机械工业出版社 | 2013-06-01 | P,JV |
| 现代C++语言核心特性解析 | 9787115564177 | 谢丙堃 | 人民邮电出版社 | 2021-10-01 | P,JV |
| 学习C++20(中文版) | 9787302625438 | [美]Paul J. Deitel,[美]Harvey M. Deitel | 清华大学出版社 | 2023-05-01 | |
| 标准C++输入输出流与本地化 | 9787115090522 | 万东旭,陈冀康 | 人民邮电出版社 | 2001-04-01 | P |
| C++ Core Guidelines解析 | 9787302635772 | [德]赖纳·格林 | 清华大学出版社 | 2023-07-01 |
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| C和指针 | 9787115522689 | [美]肯尼斯·里科 | 人民邮电出版社 | 2020-09-01 | P |
| C陷阱与缺陷 | 9787115521279 | [美]安德鲁·凯尼格 | 人民邮电出版社 | 2020-08-01 | P |
| C专家编程 | 9787115521323 | [美]彼得·范德林登 | 人民邮电出版社 | 2020-09-01 | P |
| C语言接口与实现 创建可重用软件的技术 | 9787115402523 | [美]戴维 R.汉森 | 人民邮电出版社 | 2022-07-01 |
VSCode是微软出品的编辑器,简单清凉、扩展丰富。vscode依赖扩展完成各种丰富的功能实现,像胶水一样将扩展整合起来。同时支持跨平台,可以在Windows、Linux以及Mac上使用。本文记录相关的使用方法。
Win11激活强制要求联网以及登录,在不设置的情况下,还不能跳过,如下方法教我们初装系统时跳过该两项设置。
在Windows上编译某些软件时,会提示我们使用Vs2017开发人员工具,而非普通的CMD窗口。
一般我们会从开始菜单找到“适用于VS2017的x64本机工具命令提示”,打开后再多次使用cd命令进入软件的编译目录。
本文记录一种在右键菜单中,增加打开“适用于VS2017的x64本机工具命令提示”的快速入口。
超级管理员系统内置的一个用户组,所有管理员用户都在这个组下,默认我们打开的cmd是普通用户组而非超级管理员,在Windows上编程开发,有些命令必须以管理员身份运行cmd,下面是两种操作方法。
本文记录在Windows右键菜单上增加一个以普通用户运行的“在此打开命令行窗口”的方法。
Win7的右键菜单上只有一个“在此处打开命令窗口(W)”,我平时用得PowerShell比较多,所以本文记录一种在右键菜单上增加“在此处打开PowerShell窗口”的方法。
代码统计我们时常用到,比如统计代码行数、注释行数、空行数、文件大小等等。本文介绍Windows和Linux上常用的代码工具。
上文《windterm#01#安装篇》介绍了WindTerm的安装和基本使用。本文从使用者角度,介绍WindTerm的定制方法,以期在实际使用时更加顺手。
如SecureCRT一般,WindTerm是一款多协议、多功能、跨平台的终端仿真协议程序,用于Windows/Mac/Linux等环境登录UNIX/Linux服务器主机。与其他终端工具相比,最大特点就是开源、无论商业或者非商业应用均免费,特别适合一般小型公司使用 。
如WinTerm官方所言“WindTerm is a partial open source project, and the source will be gradually opened.”,目前它是部分开源,其他代码逐步计划开源。
WindTerm的主要功能:
更多: https://github.com/kingToolbox/WindTerm/blob/master/README.md
本次对Hexo的修改,主要完成如下两个功能:
我们通常使用scp在服务器之间的copy数据,但需要每次输入账户密码才能完成copy。
比如我们欲将test.cpp文件从192.168.9.130拷贝到192.168.128服务器,一般执行流程如下图所示:

有时我们需要在脚本中自动将某些数据传输到另外一台机器上,每次输入密码则不那么方便,所以我们需要实现scp服务器间免密拷贝数据。
实现scp服务器间的密码拷贝数据,其方法一般有如下两步:
第一步,在本机生成SSH公私钥;
第二步,将本机生成的公钥拷贝到目标机器上,然后将公钥内容加入对应账号的 /home/{user}/.ssh/authorized_keys 文件内;
OpenSSH有两种认证方式:基于口令认证和基于密钥认证。 基于口令的认证相对简单,仅需在SSH客户端登录时输入密码即可。在某些场景,比如登录公司服务器,一般需要我们通过每人的密钥登录。 本文基于我经常使用的SecureCRT和WindTerm两个SSH客户端工具,分别介绍如何使用密钥登录。
OpenSSH有两种认证方式:基于口令认证和基于密钥认证。
基于口令的认证相对简单,仅需在SSH客户端登录时输入密码即可。在某些场景,比如登录公司服务器,一般需要我们通过每人的密钥登录。
本文基于我经常使用的SecureCRT和WindTerm两个SSH客户端工具,分别介绍如何使用密钥登录。
OpenSSH Server默认禁止root用户远程登录,实际工作中我们为了方便使用root账户,通常修改OpenSSH Server的配置文件,以使得root用户可以通过WindTerm或者SecrueCRT等软件登录服务器。
上文我们描述了基于源代码编译安装OpenSSH的方法,本文使用apt安装OpenSSH,并介绍OpenSSH的启动管理方法。
OpenSSH是SSH(Secure SHell)协议的免费开源实现,SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。OpenSSH是用于远程登录、命令执行以及文件传输的SSH协议的完整实现,它支持SSH协议的V1.3、V1.5和V2。自OpenSSH-V2.9 以来,默认的SSH协议是V2,使用RSA 钥匙。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务。
程序主要包括了几个部分:
- ssh - rlogin与Telnet的替代方案。
- scp、sftp - rcp的替代方案,将文件复制到其他电脑上。
- sshd - SSH服务器。
- ssh-keygen - 产生RSA或DSA密钥,用来认证用。
- ssh-agent、ssh-add - 帮助用户不需要每次都要输入密钥密码的工具。
- ssh-keyscan - 扫描一群机器,并记录其公钥。
在Centos、Ubuntu或者Debian等发行版上,我们可以使用yum或者apt提供的软件源直接安装。本文主要讲解的是使用源代码+手工编译+手工安装的方式来编译安装OpenSSH。
本文记录使用supervisor部署nginx的方法。
上文 supervisor基本使用方法教程 ,我们重点了supervisor的基本使用方法,并未对它进行过多的展开。我们知道supervisor有三个重要的部分 supervisord、supervisorctl、inet_http_server 组成,但我认为隐藏在三部分后面的配置文件,才需要重点关注和学习,毕竟它控制着所有的表现属性。为了比较好的掌握supervisor的使用,本文我们对supervisor的配置文件进行重点分析。
Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.
Supervisor是一个在类UNIX系统上,监控控制大量进程的客户端/服务端系统。其主要功能包括程序自动启动、程序奔溃后自动重启,指定进程数目等等。本文是Supervisor安装、配置和使用的简单教程。
在Linux先编译软件基本都是采用configure文件生成makefile,或者,cmake生成makefile文件两种方式。它们生成的makefile文件,一般默认不支持-g调试选项。
但我们使用这种方式编译出来的静态库时,如果程序运行中core在静态库中,我们看不到有用的相关信息。所以有必要编译出debug版本。
glibc是标准C库的GNU实现。我们采用C/C++所写的程序,运行时基本都依赖与它。如果我们想看当前机器glibc的源代码,首先需要知道当前机器glibc的版本号,然后到glibc的官网下载对应版本的源代码。
目前现代c++的主要标准有c++11/14/17/20/23,我经常使用Debian/Ubuntu的不同版本,有时候想知道当前g++默认c++标准。本文就是记录下查看标准的两种方法。
当前的工作与SVN有关,今天使用SVN库编写了一个小程序,编译代码时发现编译器告警:“warning: ‘svn_client_ls2’ is deprecated (declared at /home/svn/apps/svn/include/subversion-1/svn_client.h:4942)"。
| |
相比于静态链接库,Linux上的动态链接库和可执行程序都是ELF格式。原理上动态库也能和可执行程序一样直接运行。
比如,可以直接运行“/lib64/ld-linux-x86-64.so.2”,还有“/lib/x86_64-linux-gnu/libpthread.so.0”, 还有“/lib/x86_64-linux-gnu/libc.so.6”等等。举个例子,libc.so.6是C/C++运行时库的GNU实现,我们直接运行该动态库,打印如下信息:

可见,动态库直接运行后,提示了该动态库的编译信息、版本信息等等。在实际项目中,我们也可以为动态库增加类似功能,用户直接运行我们提供的动态库之后,我们就打印该库的编译环境、运行方法、编译版本等等信息,或者完成其他功能。
昨天看一篇关于libco的博文,里面提到了一个由于全静态链接导致的bug。全静态链接?以前没有接触过这个概念,特意到网上搜了下,原来是一个程序将其依赖的所有动态库都替换成对应静态库,即使是libc.so,libm.so,libstdc++.so这种系统级别的动态库。全静态链接出来的可执行程序,不依赖任何动态库,拷贝到任何一台机器,只需要操作系统,这个程序就可以run起来。
这种全静态链接的方式,肯定有好有坏。
那全静态链接如何优雅的实现呢?gcc为我们提供了(-static)、(-Wl,-Bstatic)、(-Wl,-Bdynamic),这么几个选项。
重启VMWare虚拟机中的操作系统,会在极端时间内重启完成,无法选择从诸如CD-ROM的其他介质启动,所以就不方便使用当前已创建的虚拟磁盘,来重新安装操作系统。本文记录如何利用已创建的磁盘来重装系统。
安装云盘软件之后,导致原来Svn和Git的文件图标都不显示了。按照如下的方法找回图标。

我在Github上有多个账号:
按照平时的使用习惯,每个账号我都会设置SSH keys进行免密登录。本文就是记录一种可以在同一台电脑上同时使用多个Github账号的方法。
如果之前你设置过全局user.name和user.email,必须先清理掉该全局设置。
也就是说,不能使用全局的user.name和user.email,必须每个仓库设置自己本地的user.name和user.email。
清理方法如下:
| |
使用虚拟机安装Debian,图形界面太耗资源,也用得比较少,所以还是以命令行界面启动比较好。如下是Debian12.10的设置方式。
Ubuntu通过netplan来配置网卡,为了研究netplan的使用方法和实现原理,我们首先通过编译安装的方法,重新定制netplan。
本文记录编译netplan的方法。