18 Jun 2015

Linux 守护进程的实现

Look at the past for inspiration, but focus on the future, because tomorrow is shaped by the choices we make today.

昨天突然地来了场面试,让我有点不知所措,好在好多好多天前复习了下,但是自感表现不是很好(面试官的声音比较柔和,更是让我不知所措)。询问了做过的项目后,看我简历上有写 Linux 进程相关的经历,就开始追问了,从 IPC 到 Redis 再到 Nginx 模块开发、网络编程,还问了下 Golang(老实讲,Go 初学,只照着官网文档看了一遍,几天后忘得差不多了),最后问了个问题,让我遗憾了好多天,就是本文的题目:如何实现守护进程?

本来这个应该知道的,前面看过 Nginx 和 Redis 基础架构,都是以 Daemon 的方式运行的。但是当时没查词典 “Daemon” 是什么意思,然而又感觉这个名词好像在哪里见过,结果便懵了,只能说不知道“守护进程”这个东西……归根到底还是因为没有相关服务端开发经验惹的祸。这不禁让我记起当年老大问我“SQL绑定变量”的原因是什么,只记得当时脸红过关羽;哎,只知道这样用,却不知这个东西叫啥……

那么守护进程到底是做什么的呢?该如何实现呢?经过一番深刻地反省和检讨之后,博主认真学习怎么去实现守护进程。

守护进程 Daemon

守护进程,也即通常所说的 Daemon 进程,是 Linux 下一种特殊的后台服务进程,它独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事件。守护进程通常在系统引导装入时启动,在系统关闭时终止。Linux 系统下大多数服务都是通过守护进程实现的。

守护进程的名称通常以 “d” 结尾,如 “httpd”、“crond”、“mysqld”等。

控制终端是什么?
终端是用户与操作系统进行交流的界面。在 Linux 系统中,用户由终端登录系统登入系统后会得到一个 shell 进程,这个终端便成为这个 shell 进程的控制终端(Controlling Terminal)。shell 进程启动的其他进程,由于复制了父进程的信息,因此也都同依附于这个控制终端。
从终端启动的进程都依附于该终端,并受终端控制和影响。终端关闭,相应的进程都会自动关闭。守护进程脱离终端的目的,也即是不受终端变化的影响不被终端打断,当然也不想在终端显示执行过程中的信息。

13 May 2015

Bash 学习笔记

bash 多行注释

单行注释,井号 # 可以搞定,下面说多行的:通过 Here Documents 实现。

:<<EOF
注释的代码...
EOF

冒号 : 是空命令,表示什么都不做,亦即相当于注释了。
“EOF” 为 Here Documents 中的定义符号,名称任意,只要前后匹配就行。

Here Documents 的更多使用方法参考这里:http://tldp.org/LDP/abs/html/here-docs.html

说明: 这种方法当注释代码里出现变量引用或者是反引号时,bash 会去尝试解析他们,会提示错误信息, 解决方法有下面几种:

05 May 2015

开源编辑器:Visual Studio Code

M$ 的 Visual Studio 家族新添一名支持 Linux 的成员,成为它家首个跨平台的代码编辑器。

Visual Studio Code 是一款面向云端应用开发的代码编辑器(轻量级 IDE ?),现阶段具备的功能有:

  • 具备家族标志性的代码补全功能
  • 突出文件导航定位的特点
  • 支持 Node.js 和 ASP.NET v5 应用开发
  • 具备 Node.js 调试功能,未来还将增添更多支持
  • 内置 Git 支持

官方首页及下载地址

Microsoft Launches Visual Studio Code, A Free Cross-Platform Code Editor For OS X, Linux And Windows

29 Apr 2015

如何启用 root 用户登录 Fedora ?

以前的 Fedora 发行版默认无法 root 登录系统,需要在普通账户下修改配置文件。

在终端输入:

[test@fedora ~]$ su  
Password:   
[root@fedora test]# vim /etc/pam.d/gdm-password  

注释掉这段及前面加上#号,如下:

#auth        required      pam_succeed_if.so user != root quiet  

保存之后注销再用 root 和密码登陆就好了。

修改目录 /etc/pam.d/gdm 与 /etc/pam.d/gdm-password 两个文件

一般修改方法:

在终端中输入su 命令并输入root密码这样我在终端中就有了root的操权限接下来我们使用gdit命令对其进行修改

vim /etc/pam.d/gdm  

在这段 “auth required pam_succeed_if.so user != root quiet” 加上 # 号注释掉就可以了

同样的 vim /etc/pam.d/gdm-password
也是在 auth required pam_succeed_if.so user != root quiet 前面加上 # 号注释

保存之后我们重启或者注销一次计算机就能以 root 进行登录系统了

11 Mar 2015

十个基础算法及其讲解

Algorithms

算法一:快速排序算法

快速排序是由东尼·霍尔所发展的一种排序算法。
在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n^2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

QuickSort

算法步骤

  1. 从数列中挑出一个元素,称为 “基准”(pivot)。
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

08 Mar 2015

Bash 快捷键

Ctrl 键组合

ctrl+a  # 光标移到行首
ctrl+e  # 光标移到行尾
ctrl+b  # 光标左移一个字母
ctrl+f  # 光标右移
ctrl+c  # 杀死当前进程
ctrl+d  # 退出当前 Shell
ctrl+h  # 删除光标前一个字符,同 backspace 键相同
ctrl+d  # 删除光标所在字母;注意和 backspace 以及 ctrl+h 的区别,这2个是删除光标前的字符
ctrl+w  # 移除光标前的一个单词
ctrl+k  # 清除光标后至行尾的内容
ctrl+u  # 清除光标前至行首间的所有内容
ctrl+t  # 交换光标位置前的两个字符
ctrl+y  # 粘贴或者恢复上次的删除
ctrl+l  # 清屏,相当于 clear
ctrl+r  # 搜索之前打过的命令。会有一个提示,根据你输入的关键字进行搜索bash的history
ctrl+z  # 把当前进程转到后台运行,使用 fg 命令恢复。比如 top -d1 然后 ctrl+z,到后台,然后 fg,重新恢复

Esc 键组合

esc+d   # 删除光标后的一个词
esc+f   # 往右跳一个词
esc+b   # 往左跳一个词
esc+t   # 交换光标位置前的两个单词