APUE(二) 进程
进程1int main(int argc, char *argv[]); 当内核执行c程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。可执行文件将此启动例程指定为程序的起始地址。启动例程从内核取得命令行参数和环境变量的值。然后为调用main函数做好准备。 进程终止有八种方式,其中五种为正常终止: 正常终止 从main返回 调用exit 调用_exit或_Exit 最后一个线程从其启动例程返回 最后一个线程调用pthread_exit 异常终止: 调用abort 接到一个信号 最后一个线程对取消请求作出响应 12345#include<stdlib.h>void exit(int status);void _Exit(int status);#include<unsitd.h>void _exit(int status); 这三个函数用于正常终止一个程序:_exit和_Exit立即进入内核,exit先执行一些清理处理,然后返回内核。 exit函数总是执行一个标准I/O库的清理关闭操作(对所有打开流调用fclose函...
APUE(一) IO与文件操作
文件IO不带缓冲的io(unix系统在内核中设有缓冲区,这个不带缓冲意思是用户不自己缓冲),每个read和write都调用内核中的一个系统调用。 文件描述符对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。 Unix系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。在符合POSIX.1的程序中,幻数0,1,2已被标准化为符号常量STDIN_FILENO, STDOUT_FILENO和STDERR_FILENO。这些常量定义在<unistd.h>文件中。文件描述符的变化范围是0~OPEN_MAX-1。 文件IO函数1234567#include<fcntl.h>//open函数成功返回文件描述符,出错返回-1int open(const char *path, int oflag,... /* mode_t mode */);int openat(int fd, const char *path, int of...
Use GPG to whisper
GnuPG(GNU Privacy Guard,GPG)是一种加密软件,它是PGP加密软件的开源替代物。GnuPG依照由IETF制定的OpenPGP技术标准设计。GnuPG是用于加密、数字签章及产生非对称匙对的软件。GPG兼容PGP(Pretty Good Privacy)的功能。 安装一般like uinx下会都包含GPG软件包。gpg --version查看是否安装与版本。 同样gpg --help获取命令帮助。 生成密钥1234567# 生成新的密钥对gpg --gen-keygpg --generate-key## 更多密钥配置选项生成新的密钥对gpg --full-generate-keygpg --full-gen-key 生成密钥时,会要求做一些随机的举动(敲打键盘、移动鼠标、读写硬盘之类),以生成一个随机数。生成过程需要一段时间。 显示密钥生成的密钥一般存在与~/.gnupg目录下。可以通过如下命令查看: 123456gpg -kgpg --list-keys# 显示某个用户的密钥信息gpg --list-key [用户id]# 显示私钥信息gpg --l...
程序员的自我修养--链接,装载与库
编译器把c语言编程成可执行的机器码之间发生了什么? 编译出来的可执行文件里是什么? 程序是怎么运行起来的? 真正了不起的程序员对自己的程序的每一个字节都了如指掌。 当我们将一段代码编译成可执行文件时,可分解为四个步骤:预处理(Prepressing), 编译(Compilation), 汇编(Assembly), 链接(Linking)。 预处理阶段123gcc -E hello.c -o hello.icpp hello.c > hello.i 预处理过程主要处理那些源代码文件中的以”#”开始的预编译指令。比如: #include, #define等,主要处理规则如下: 将所有的#define删除,并且展开所有的宏定义。 处理所有条件预编译指令,比如#if, #ifdef, #elif, #else, #endif。 处理#include预编译指令, 将被包含的文件插入到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。 删除所有的注释”//“和”/**/“。 添加行号和文件名标识,以便...
极速Lua教程
Lua由巴西里约热内卢天主教大学PUC-Rio的一个团队设计、实施和维护。”Lua”(发音为LOO-ah)在葡萄牙语中的意思是”月亮”。 Lua 是一种强大、高效、轻量级、可嵌入的脚本语言。它支持过程编程、面向对象编程、函数编程、数据驱动编程和数据描述。 Lua 将简单的过程语法和基于关联数组和可扩展语义的强大数据描述构造相结合。Lua 是动态键入的,通过使用基于寄存器的虚拟机解释字节码来运行,并且具有具有增量垃圾回收的自动内存管理,因此非常适合配置、脚本编写和快速原型设计。 安装Lua官网下载:www.lua.org/download.html。 1234tar zxvf lua-5.x.x.tar.gzcd lua-5.x.xmake linux testmake install 注释123456--单行注释--[[多行注释多行注释--]] 变量数据类型 数据类型 描述 nil 表示一个无效值,只有值nil属于该类,相当于条件表达式中的false boolean true(0,空字符串是true)或者false(只有nil和false是false)...
JS时序图与流程图使用
123456789101112131415st=>start: Start|past:>http://www.google.com[blank]e=>end: End:>http://www.google.comop1=>operation: My Operation|pastop2=>operation: Stuff|currentsub1=>subroutine: My Subroutine|invalidcond=>condition: Yesor No?|approved:>http://www.google.comc2=>condition: Good idea|rejectedio=>inputoutput: catch something...|requestst->op1(right)->condcond(yes, right)->c2cond(no)->sub1(left)->op1c2(yes)->io->ec2(no)->op2->e ...
使用 hugo + nginx 服务器搭建个人博客
基础环境搭建最初由于使用 root 账号+简单密码 ssh 服务器,导致第二天收到tx云报警,该服务器已被暴力破解,最终无奈重装系统。 不要使用 root 用户 ssh 服务器,创建一个全新的用户,且加大密码复杂度。(关于构建一套个人密码管理系统,有望后续撰写一篇blog,此处留坑。) 1234567891011sudo su //切换root用户获取创建用户的权限useradd hellopasswd worldusermod -s /bin/bash hello //为用户指定shellusermod -d /home/hello hello //为用户指定用户目录cat /etc/passwd //查看用户属性su hello //切换用户 go语言环境搭建在go语言官网下载对应安装包。 1wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz 解压到/usr/local目录下,进入该目录下的go目录里,检查是否能正常执行显示go版本。 123456tar -C /usr/local -z...
Go语言总结
Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,好称“大道至简”,是新时代的“C语言”。 Go语言基本语法变量go语言语法规定,定义的局部变量若没有被调用会发生编译错误。 变量声明格式如下: 12345678910111213//var 变量名 变量类型 var a int//批量声明var( a int b string c []float32 d func() bool e struct { x int y string }) 未初始化的变量将被默认初始化: 整型和浮点型变量默认值为0。 字符串默认值为空字符串。 布尔型默认值为 false。 函数,指针变量,切片默认值为 nil。 go语言拥有多种初始化方式: 12345678910//标准格式var 变量名 变量类型 = 表达式//编译器自动推断类型格式var 变量名 = 表达式//短变量声明格式变量名 := 表达式var a int = 10var b = 10b := 10 短变量声明模式只能用于函数体内,该变量名必须是没有定义过的变量,若定义过...
在C语言中运用面向对象与设计模式
面向对象编程(object-oriented programming),是一种设计思想或者架构风格,而非仅仅是编码方式,OOP程序也并不一定要用OOP语言来写。 OOP拥有封装,继承与多态三大特性,但 $OOP \not= 封装+继承+多态$。 封装是想把一段逻辑/概念抽象出来做到”相对独立”。多态是指让一组Object表达同一概念,并展现不同的行为。继承是希望通过类型的is-a关系来实现代码的复用。 在c语言里运用面向对象c语言有哪些方法来支持OOP编程呢? struct结构体,可以将对象的状态和行为封装在一起。 函数当然也可以封装,实现简洁的接口与复杂的内部隐藏,函数指针关联对象的行为。 static关键字可以控制变量与函数的作用域,避免命名冲突与链接错误。 const关键字约束一些变量的行为。 类型转换,void类型转换,结构体类型转换一定程度上可以模拟多态与继承。 一些命名规范也可以起到访问控制的说明。 #define宏语法实现的代码复用。 首先看一个基础的的栈实现方式: stack.h头文件 1234567#ifndef _STACK_H_#...
GDB的常用调试手段
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具。 生出调试信息1gcc -g hello.c -o hello coredump配置 建立储存coredump文件的文件夹: mkdir ~/corefile 查看,设置coredump文件大小: ulimit -a ulimit -c unlimited 执行以下两条命令: echo "1" > /proc/sys/kernel/core_uses_pid // 将1写入到该文件里 echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern 修改配置文件/etc/profile 修改ulimit -S -c 0 > /dev/null 2>&1 为 ulimit -S -c unlimited > /dev/nu...
