0%

C语言的按位运算符

​ 按位运算符,在实际的程序中用的不是很多,主要的应用是底层系统操作,比如嵌入式、驱动等,它的作用就是对位进行操作,这个就要比较熟悉各种进制的转换了。

​ 几个按位运算符的含义如下:

按位运算符 含义
& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 按位左移
>> 按位右移

举个例子来show一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*advance/operator/operator1.c*/
#include <stdio.h>

int main()
{
int a = 5; //0b101
int b = 3; //0b011

printf("%d & %d : %d\n", a, b, (a & b));
printf("%d | %d : %d\n", a, b, (a | b));
printf("%d ^ %d : %d\n", a, b, (a ^ b));
printf("~%d : %d\n", a, ~a);
printf("%d<<1 : %d\n", a, a << 1);
printf("%d>>1 : %d\n", b, b >> 1);

return 0;
}

相应地Makefile如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
#advance/operator/Makefile

ALL : operator1

operator1: operator1.c
gcc -o operator1 operator1.c

.PHONY : clean

clean:
rm -f operator1

我们可以看到,这一次的Makefile我们多了一个.PHONY行,这是一个伪目标,主要作用是防止Makefile定义的可执行命令的目标跟工作目录里面的文件重名而出现无法运行的问题,在这也提高了执行时的效率,建议每个Makefile都要包含。

输入make,然后./operator1输出为:

1
2
3
4
5
6
5 & 3 : 1
5 | 3 : 7
5 ^ 3 : 6
~5 : -6
5<<1 : 10
3>>1 : 1

可以看到结果就是对每一位进行的操作

python中read() readline()以及readlines()用法

文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。
每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。

  • read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。
  • readline() 和 readlines() 非常相似。它们都在类似于以下的结构中使用:

Python .readlines() 示例

1
2
3
fh = open(‘c:\\autoexec.bat’)
for line in fh.readlines():
print line

.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

Linux 下的编辑器

[TOC]

遍寻编辑器那么多,最爱的还是VIM

gedit

gedit无需多言,Linux各个发行版默认都有的编辑器,类似于Windows的记事本,不过可以根据代码类型着色,这点可比记事本NB。

Sublime Text

最后一个神器就是Sublime Text 2,一个基本上可以称得上是IDE的编辑器,最先看到是在前公司的前端工程师的Mac上,看官方的介绍感觉又是一款类似于Vim的神器,但是比Vim界面更好看,功能更全面,非常适合PHP、Python、JavaScript这些Web开发。

下载/安装:http://www.sublimetext.com

Notepad++(Windows)

Notepad++ 是很多Windows用户寻找的比记事本更优秀的文本编辑器。它拥有很多丰富先进的特性,例如语法高亮显示,代码折叠和宏,但不同于大多数其他的基于GUI的文本编辑器功能,Notepad++是完全自由而且开放源代码。它和其他的编辑器相比可能并非性感如起飞的蝙蝠。但它完全定制,因此只受限于您的时间和想象力。作为一个编辑器,它的强大是不言而喻的。

Emacs (适合所有平台)

高级程序员的主要文本编辑器。在Emacs(编辑宏)最受欢迎的是内置宏和清大的键盘命令,使编辑的文本文件,尤其是代码很好高兴。常说:您可能不会完全明白Emacs的,直到您花一些时间去了解它。该程序已经被移植到几乎所有的平台,并有多个发行版,其中最流行的可能是GNU Emacs和XEmacs,它们都是免费、跨平台和开放源码。

UltraEdit (Windows)

共享软件UltraEdit($49.95)用户感觉很友好的编辑器,支持语法高亮显示,代码折叠宏和和同类软件相比拥有大量的可用功能。UltraEdit是一个很好的WEB开发平台,提供很多高级特性用来构建HTML,PHP,JavaScript和更多其它的网络编程语言。

TextMate (Mac OS X)

强大而且更具吸引力,TextMate ($63)出现在视野中仅仅几年时间而且因有吸引力的界面、功能强大的宏、以及可下载和可编辑的束,迅速的获得了狂热的追捧。Windows用户要是喜欢TextMate可以试一下E Text Editor(一个类似于TextMate且支持TextMate宏束的文本编辑器)。

Vim(所有平台)

Vim的强大就不用多说了,非常熟练Vim的话所有的工作都可以使用Vim去完成,Vim也称为编辑器的瑞士军刀,是高级程序员的一个强大工具。也类似于Emacs,Vim也有不同的口味,除了原来的,还有Windows平台的gVim 和 gVim Portable,Mac平台的MacVim,如果你认为你可能的兴趣在Vim中已经提供,但尚未准备好一步一步深入这款功能强大而又有点不易用的编辑器,

EditPlus

EditPlus(文字编辑器)汉化版一套功能强大,可取代记事本的文字编辑器,EditPlus拥有无限制的撤消与重做、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴板的功能,能够同步于剪贴板自动将文字粘贴进 EditPlus 的编辑窗口中,让你省去粘贴的步骤。另外它也是一个非常好用的HTML编辑器,它除了支持颜色标记、HTML 标记,同时支持C、C++、Perl、Java,另外,它还内建完整的HTML & CSS1 指令功能,对于习惯用记事本编辑网页的朋友,它可帮你节省一半以上的网页制作时间,若你有安装IE3.0 以上版本,它还会结合IE浏览器于 EditPlus 窗口中,让你可以直接预览编辑好的网页(若没安装IE,也可指定浏览器路径)。因此,它是一个相当棒又多用途多状态的编辑软件。

Linux shell中的for循环用法详解

for循环有多用用法,比如:

  • for i in “file1” “file2” “file3”
  • for i in /boot/*
  • for i in /etc/*.conf
  • for i in $(seq -w 10) –》等宽的01-10
  • for i in {1…10}
  • for i in $( ls )
  • for I in $(< file)
  • for i in “$@” –》取所有位置参数,可简写为for i

注意:bash shell支持C式for循环

Shell

ash shell

Ash shell是一种低预算的shell,体型较小,提供基本特性。尤其适合低内存应用,例如嵌入式Linux系统。

Dash shell是Debian Linux发型的ash shell,及Debian ash shell的缩写。

对于Ubuntu这里需要注意,Ubuntu Linux使用bash shell作为默认的交互式shell,但是使用dash shell作为默认的/bin/sh shell。这个特性很容易让shell编程人员感到混乱,甚至是有时脚本无法运行。

我们一般编写脚本的时候通常使用#!/bin/sh,但是由上面可以知道ubuntu会把这个指向dash,所以还是写成#!/bin/bash吧,这样比较保险。

tcsh shell

Linux世界中另一种流行的shell是C shell,C shell是将C编程语言中的特性合并到shell脚本中,最流行的开源C shell是tcsh shell。

C shell的目的是提供一个适合C编程人员的命令行和脚本编写环境。

20世纪70年代后期Ken Greer对C shell进行扩展,添加了TENEX操作系统的命令行编程特性,这就是tcsh的由来。

tcsh shell环境变量可能有点混淆、Bourne shell及其派生的bash、ash和dash都只是使用一种环境变量来存储系统信息。而tcsh shell包含两种环境变量:

  • shell变量;
  • 系统环境变量; 系统环境变量由大写字母组成,提供标准系统信息。Tcsh shell变量是小写变量,对shell具有特殊含义。

对于shell变量,可以使用set命令设置shell变量值。或者@也可以。

Korn shell

Korn shell在Unix世界中很流行,但是在Linux世界中并不同样流行。Korn shell提供了Bourne shell和c shell世界的混合特性。

原始Korn shell是David Korn于20世纪80年代在AT&T贝尔实验室工作期间开发的。

Korn shell分两种不同的路线:

  • Ksh88
  • Ksh93

大多数实现使用的是ksh93 shell。

Ksh93 shell的一个很棒的特性是可以轻松的使用数学运算。

执行数学运算的方法有两种;

  • let命令;
  • 双圆括号;

对于许多编程人员来说,ksh93 shell的卖点就是它对浮点数的完全支持。

zsh shell

Zsh shell提供一些神奇的特性,并将shell未来发展的门槛提高到相当高的高度。

Zsh是Paul Falstad开发的开源Unix Shell。它是集合了Bourne、bash、ash和tcsh等shell的特性,这句话很NB呀,并加入了许多特有的特性,以编程人员使用为目的而创建的一种成熟的高级shell。

其中一些特性使得zsh独具特色:

  • 改良的shell选项控制;
  • Shell兼容性的模式;
  • 可载入模块。

在这些特色中,可载入模块在shell设计中思想最先进。

zsh shell提供一个核心内置命令集,还提供添加附加命令模块(command modules)的功能。

Zsh是目前自定义功能最强的shell。

可以使用zmodload命令添加ash的模块,如果不加任何参数,可以显示zsh中的模块。

要删除一个模块可以使用-u参数,例如zmodload –u zsh/net/tcp就可以删除tcp模块了。

Linux shell 编写规范化、标准化

脚本中多写注释

作注释不仅方便自己还能帮助别人在翻阅你的脚本时了解脚本的不同部分所做的工作。

注释用 # 号来定义。

当运行失败时使脚本退出

有时即使某些命令运行失败,bash 可能继续去执行脚本,这样就影响到脚本的其余部分(会最终导致逻辑错误)。

此时可以把下面的内容写在脚本的前面在遇到命令失败时来退出脚本执行:

1
2
3
4
# 如果命令运行失败让脚本退出执行 
set -o errexit
# 或者
set -e

当 Bash 用未声明变量时使脚本退出

Bash 也可能会使用能导致起逻辑错误的未声明的变量。因此用下面行的方式去通知 bash

当它尝试去用一个未声明变量时就退出脚本执行:

1
2
3
4
# 若有用未设置的变量即让脚本退出执行 
set -o nounset
#或者
set -u

使用双引号来引用变量

用双引号有助于防止由于空格导致单词分割开和由于识别和扩展了通配符而导致的不必要匹配。

在脚本中使用函数

除了非常小的脚本(只有几行代码),总是记得用函数来使代码模块化且使得脚本更可读和可重用。

写函数的语法如下所示:
1
2
3
4
5
6
7
8
9
function  demo(){   
command1;
command2;
}
# 或
demo(){
command1;
command2;
}

如果写成单行代码时,每个命令后要用终止符号:

1
demo(){ command1; command2; }

字符串比较时用 = 而不是 ==

注意: == 是 = 的同义词,因此仅用个单 = 来做字符串比较,

用 $(command) 来做代换

命令代换是用这个命令的输出结果取代命令本身。用 $(command) 而不是引号 command 来做命令代换。

这种做法也是 shellcheck tool (可针对 shell 脚本显示警告和建议)所建议的。例如:

1
2
user=`echo$UID”` 
user=$(echo$UID”)

用 readonly 来声明静态变量

静态变量不会改变;它的值一旦在脚本中定义后不能被修改:

1
readonly mycountry=”China” 

环境变量用大写字母命名,而自定义变量用小写

所有的 bash 环境变量用大写字母去命名,因此用小写字母来命名你的自定义变量以避免变量名冲突:

其他需要注意的

  • 变量名,函数名要有实际意义,函数名以动名词形式,第二个单词首字母要大写。例如:updateConfig()
  • 取变量值使用大括号,如${varname}
  • 删除文件时,如果路径有变量的,要判断变量有值,如rm -f ${abc}/* 如果变量abc没有值,则会把根目录下的文件删除
  • 脚本中尽量不要使用cd变换目录
  • 函数中也要有功能描述,使用依法,版本,日期等
  • 函数的功能要单一,不要太复杂
  • $()比 更好
  • 尽量不要使用多层if语句,而应该以case语句替代
  • 如果需要执行确定次数的循环,应该用for语句替代while语句
  • 输入的参数要有正确性判断

Linux shell中的变量

检查变量是否存在

1
2
3
4
5
6
if [ -z "$a" ]
then
echo "not defined"
else
echo "defined"
fi

Shell

ash shell

Ash shell是一种低预算的shell,体型较小,提供基本特性。尤其适合低内存应用,例如嵌入式Linux系统。

Dash shell是Debian Linux发型的ash shell,及Debian ash shell的缩写。

对于Ubuntu这里需要注意,Ubuntu Linux使用bash shell作为默认的交互式shell,但是使用dash shell作为默认的/bin/sh shell。这个特性很容易让shell编程人员感到混乱,甚至是有时脚本无法运行。

我们一般编写脚本的时候通常使用#!/bin/sh,但是由上面可以知道ubuntu会把这个指向dash,所以还是写成#!/bin/bash吧,这样比较保险。

tcsh shell

Linux世界中另一种流行的shell是C shell,C shell是将C编程语言中的特性合并到shell脚本中,最流行的开源C shell是tcsh shell。

C shell的目的是提供一个适合C编程人员的命令行和脚本编写环境。

20世纪70年代后期Ken Greer对C shell进行扩展,添加了TENEX操作系统的命令行编程特性,这就是tcsh的由来。

tcsh shell环境变量可能有点混淆、Bourne shell及其派生的bash、ash和dash都只是使用一种环境变量来存储系统信息。而tcsh shell包含两种环境变量:

  • shell变量;
  • 系统环境变量; 系统环境变量由大写字母组成,提供标准系统信息。Tcsh shell变量是小写变量,对shell具有特殊含义。

对于shell变量,可以使用set命令设置shell变量值。或者@也可以。

Korn shell

Korn shell在Unix世界中很流行,但是在Linux世界中并不同样流行。Korn shell提供了Bourne shell和c shell世界的混合特性。

原始Korn shell是David Korn于20世纪80年代在AT&T贝尔实验室工作期间开发的。

Korn shell分两种不同的路线:

  • Ksh88
  • Ksh93

大多数实现使用的是ksh93 shell。

Ksh93 shell的一个很棒的特性是可以轻松的使用数学运算。

执行数学运算的方法有两种;

  • let命令;
  • 双圆括号;

对于许多编程人员来说,ksh93 shell的卖点就是它对浮点数的完全支持。

zsh shell

Zsh shell提供一些神奇的特性,并将shell未来发展的门槛提高到相当高的高度。

Zsh是Paul Falstad开发的开源Unix Shell。它是集合了Bourne、bash、ash和tcsh等shell的特性,这句话很NB呀,并加入了许多特有的特性,以编程人员使用为目的而创建的一种成熟的高级shell。

其中一些特性使得zsh独具特色:

  • 改良的shell选项控制;
  • Shell兼容性的模式;
  • 可载入模块。

在这些特色中,可载入模块在shell设计中思想最先进。

zsh shell提供一个核心内置命令集,还提供添加附加命令模块(command modules)的功能。

Zsh是目前自定义功能最强的shell。

可以使用zmodload命令添加ash的模块,如果不加任何参数,可以显示zsh中的模块。

要删除一个模块可以使用-u参数,例如zmodload –u zsh/net/tcp就可以删除tcp模块了。

深入研究Linux内核

Linux系统的核心成为内核kernel,内核控制计算机上的所有硬件和软件,并在必要的时候分配硬件,在需要时执行软件。

内核主要有以下4中功能:

系统内存管理

内存管理是操作系统内核的主要功能之一,内核不仅可以管理服务器上可用的物理内存,而且能够创建并管理虚拟内存,或者说非实际存在的内存。内存管理必须要使用硬盘空间,该空间成为交换空间swap space,内核不断地在交换空间和实际物理内存之间交换虚拟内存位置的内容,这样系统认为可用的内存比实际存在的内存多。使用ipcs可以查看系统当前的共享内存分页。

软件程序管理

Linux操作系统将正在运行的程序成为进程,进程可以在前台运行,也可以在后台运行,内核控制Linux系统如何管理在系统中运行的所有进程。内核创建的第一个进程,成为初始进程init process,该进程可在系统上启动所有其他进程,内核启动时,它将初始进程加载到虚拟内存中。内核每启动一个其他进程,都将在虚拟内存中为其分配一个唯一的空间,用于存储该进程使用的数据和代码。

硬件管理

Linux系统需要与之通信的设备都必须在内核代码中插入驱动程序代码、驱动程序代码使内核能够向设备传输数据,它的作用就像是应用程序与硬件之间的中间人、在Linux内核中插入设备驱动程序代码有两种方法:

  • 在内核中编译驱动程序;
  • 向内核添加驱动程序模块;

目前Linux系统将硬件设备标示为特殊文件,成为设备文件,大致分为3类:

  • 字符设备
  • 主要用于哪些一次仅处理一个字符的设备,比如调制解调器和终端类型
  • 块设备
  • 主要用于哪些一次可以处理大量数据块的设备,比如磁盘驱动器
  • 网络设备
  • 主要用于使用数据包发送和接收数据的设备,包括网卡和特殊的回路设备,允许Linux系统使用通用网络编程协议与自身通信。

文件系统管理

Linux内核可以使用不同类型的文件系统与硬盘传输数据,Linux内核使用虚拟文件系统(Virtual File System,VFS)与每个文件系统进行连接。这为内核与其他文件系统类型的通信提供了一个标准接口。

GNU实用程序

除了使用内核控制硬件设备外,计算机操作系统还需要使用程序执行标准功能,所以,除了Linux系统内核,我们还需要一些系统实用程序。

GNU组织(GNU代表GNU’s Not Unix)开发了一个完整的Unix使用程序集,这些实用程序的开发基于一种新的软件思想,成为开源软件(OSS)。

Linus的Linux内核与GNU操作系统实用程序的结合诞生了一个完整的、功能强大的免费操作系统。所有Linux实际上应该是GNU/Linux。

核心GNU实用程序成为coreutils软件包,主要包括:

  • 处理文件的实用程序;
  • 操作文本的实用程序;
  • 管理进程的实用程序;

Shell是一个特殊的交互式使用程序,它为用户提供了一种启动程序、管理文件系统中的文件和管理运行在Linux系统上的进程的方式。Shell的核心是命令提示符,命令提示符是shell用于交互的组成部分,它允许输入文本命令,解释命令,然后再内核中执行命令。

目前大部分发行版默认的是Bash shell,当然还有很多shell版本。

Shell 描述
ash ash shell是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。
bash bash是Linux系统默认使用的shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个(可使用help命令查看)。Linux使用它作为默认的shell是因为它有诸如以下的特色: 可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令; 自动通过查找匹配的方式给出以某字符串开头的命令; 包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。
ksh ksh是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
csh csh是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh
zsh zch是Linux最大的shell之一,由Paul Falstad完成,共有84个内部命令。如果只是一般的用途,是没有必要安装这样的shell的。