在linux中进程退出之后会有一个退出状态,可以通过$echo $?进行查看。
如果说把进程比作一个人(病人和正常人)的话那么进程退出码就可以看做是病人的症状!
挺好用的如果你发现执行某个命令或自己编写的代码生成的ELF文件发现毛都没发生过就可以通过该指令进行查看。
那么不同的退查状态又说明进程发生了什么了呢?可以通过perror进行查看!下面是通过通过perror指令查看得到的所有的退出码的解析(en)。
OS error code 0: Success
OS error code 1: Operation not permitted
OS error code 2: No such file or directory
OS error code 3: No such process
OS error code 4: Interrupted system call
OS error code 5: Input/output error
OS error code 6: No such device or address
OS error code 7: Argument list too long
OS error code 8: Exec format error
OS error code 9: Bad file descriptor
OS error code 10: No child processes
OS error code 11: Resource temporarily unavailable
OS error code 12: Cannot allocate memory
OS error code 13: Permission denied
OS error code 14: Bad address
OS error code 15: Block device required
OS error code 16: Device or resource busy
OS error code 17: File exists
OS error code 18: Invalid cross-device link
OS error code 19: No such device
OS error code 20: Not a directory
OS error code 21: Is a directory
OS error code 22: Invalid argument
OS error code 23: Too many open files in system
OS error code 24: Too many open files
OS error code 25: Inappropriate ioctl for device
OS error code 26: Text file busy
OS error code 27: File too large
OS error code 28: No space left on device
OS error code 29: Illegal seek
OS error code 30: Read-only file system
OS error code 31: Too many links
OS error code 32: Broken pipe
OS error code 33: Numerical argument out of domain
OS error code 34: Numerical result out of range
OS error code 35: Resource deadlock avoided
OS error code 36: File name too long
OS error code 37: No locks available
OS error code 38: Function not implemented
OS error code 39: Directory not empty
OS error code 40: Too many levels of symbolic links
Illegal error code: 41
OS error code 42: No message of desired type
OS error code 43: Identifier removed
OS error code 44: Channel number out of range
OS error code 45: Level 2 not synchronized
OS error code 46: Level 3 halted
OS error code 47: Level 3 reset
OS error code 48: Link number out of range
OS error code 49: Protocol driver not attached
OS error code 50: No CSI structure available
OS error code 51: Level 2 halted
OS error code 52: Invalid exchange
OS error code 53: Invalid request descriptor
OS error code 54: Exchange full
OS error code 55: No anode
OS error code 56: Invalid request code
OS error code 57: Invalid slot
Illegal error code: 58
OS error code 59: Bad font file format
OS error code 60: Device not a stream
OS error code 61: No data available
OS error code 62: Timer expired
OS error code 63: Out of streams resources
OS error code 64: Machine is not on the network
OS error code 65: Package not installed
OS error code 66: Object is remote
OS error code 67: Link has been severed
OS error code 68: Advertise error
OS error code 69: Srmount error
OS error code 70: Communication error on send
OS error code 71: Protocol error
OS error code 72: Multihop attempted
OS error code 73: RFS specific error
OS error code 74: Bad message
OS error code 75: Value too large for defined data type
OS error code 76: Name not unique on network
OS error code 77: File descriptor in bad state
OS error code 78: Remote address changed
OS error code 79: Can not access a needed shared library
OS error code 80: Accessing a corrupted shared library
OS error code 81: .lib section in a.out corrupted
OS error code 82: Attempting to link in too many shared libraries
OS error code 83: Cannot exec a shared library directly
OS error code 84: Invalid or incomplete multibyte or wide character
OS error code 85: Interrupted system call should be restarted
OS error code 86: Streams pipe error
OS error code 87: Too many users
OS error code 88: Socket operation on non-socket
OS error code 89: Destination address required
OS error code 90: Message too long
OS error code 91: Protocol wrong type for socket
OS error code 92: Protocol not available
OS error code 93: Protocol not supported
OS error code 94: Socket type not supported
OS error code 95: Operation not supported
OS error code 96: Protocol family not supported
OS error code 97: Address family not supported by protocol
OS error code 98: Address already in use
OS error code 99: Cannot assign requested address
OS error code 100: Network is down
OS error code 101: Network is unreachable
OS error code 102: Network dropped connection on reset
OS error code 103: Software caused connection abort
OS error code 104: Connection reset by peer
OS error code 105: No buffer space available
OS error code 106: Transport endpoint is already connected
OS error code 107: Transport endpoint is not connected
OS error code 108: Cannot send after transport endpoint shutdown
OS error code 109: Too many references: cannot splice
OS error code 110: Connection timed out
OS error code 111: Connection refused
OS error code 112: Host is down
OS error code 113: No route to host
OS error code 114: Operation already in progress
OS error code 115: Operation now in progress
OS error code 116: Stale NFS file handle
OS error code 117: Structure needs cleaning
OS error code 118: Not a XENIX named type file
OS error code 119: No XENIX semaphores available
OS error code 120: Is a named type file
MySQL error code 120: Didn't find key on read or update
OS error code 121: Remote I/O error
MySQL error code 121: Duplicate key on write or update
OS error code 122: Disk quota exceeded
MySQL error code 122: Internal (unspecified) error in handler
OS error code 123: No medium found
MySQL error code 123: Someone has changed the row since it was read (while the table was locked to prevent it)
OS error code 124: Wrong medium type
MySQL error code 124: Wrong index given to function
OS error code 125: Operation canceled
MySQL error code 125: Undefined handler error 125
OS error code 126: Required key not available
MySQL error code 126: Index file is crashed
OS error code 127: Key has expired
MySQL error code 127: Record file is crashed
OS error code 128: Key has been revoked
MySQL error code 128: Out of memory in engine
OS error code 129: Key was rejected by service
MySQL error code 129: Undefined handler error 129
OS error code 130: Owner died
MySQL error code 130: Incorrect file format
OS error code 131: State not recoverable
MySQL error code 131: Command not supported by database
OS error code 132: Operation not possible due to RF-kill
MySQL error code 132: Old database file
MySQL error code 133: No record read before update
MySQL error code 134: Record was already deleted (or record file crashed)
MySQL error code 135: No more room in record file
MySQL error code 136: No more room in index file
MySQL error code 137: No more records (read after end of file)
MySQL error code 138: Unsupported extension used for table
MySQL error code 139: Too big row
MySQL error code 140: Wrong create options
MySQL error code 141: Duplicate unique key or constraint on write or update
MySQL error code 142: Unknown character set used in table
MySQL error code 143: Conflicting table definitions in sub-tables of MERGE table
MySQL error code 144: Table is crashed and last repair failed
MySQL error code 145: Table was marked as crashed and should be repaired
MySQL error code 146: Lock timed out; Retry transaction
MySQL error code 147: Lock table is full; Restart program with a larger locktable
MySQL error code 148: Updates are not allowed under a read only transactions
MySQL error code 149: Lock deadlock; Retry transaction
MySQL error code 150: Foreign key constraint is incorrectly formed
MySQL error code 151: Cannot add a child row
MySQL error code 152: Cannot delete a parent row
MySQL error code 153: No savepoint with that name
MySQL error code 154: Non unique key block size
MySQL error code 155: The table does not exist in engine
MySQL error code 156: The table already existed in storage engine
MySQL error code 157: Could not connect to storage engine
MySQL error code 158: Unexpected null pointer found when using spatial index
MySQL error code 159: The table changed in storage engine
MySQL error code 160: There's no partition in table for the given value
MySQL error code 161: Row-based binlogging of row failed
MySQL error code 162: Index needed in foreign key constraint
MySQL error code 163: Upholding foreign key constraints would lead to a duplicate key error in some other table
MySQL error code 164: Table needs to be upgraded before it can be used
MySQL error code 165: Table is read only
MySQL error code 166: Failed to get next auto increment value
MySQL error code 167: Failed to set row auto increment value
MySQL error code 168: Unknown (generic) error from engine
MySQL error code 169: Record is the same
MySQL error code 170: It is not possible to log this statement
MySQL error code 171: The event was corrupt, leading to illegal data being read
MySQL error code 172: The table is of a new format not supported by this version
MySQL error code 173: The event could not be processed no other hanlder error happened
MySQL error code 174: Got a fatal error during initialzaction of handler
MySQL error code 175: File to short; Expected more data in file
MySQL error code 176: Read page with wrong checksum
MySQL error code 177: Too many active concurrent transactions
Illegal error code: 178
Illegal error code: 179
Illegal error code: 180
Illegal error code: 181
Illegal error code: 182
Illegal error code: 183
Illegal error code: 184
Illegal error code: 185
Illegal error code: 186
Illegal error code: 187
Illegal error code: 188
Illegal error code: 189
Illegal error code: 190
Illegal error code: 191
Illegal error code: 192
Illegal error code: 193
Illegal error code: 194
Illegal error code: 195
Illegal error code: 196
Illegal error code: 197
Illegal error code: 198
Illegal error code: 199
Illegal error code: 200
Illegal error code: 201
Illegal error code: 202
Illegal error code: 203
Illegal error code: 204
Illegal error code: 205
Illegal error code: 206
Illegal error code: 207
Illegal error code: 208
Illegal error code: 209
Illegal error code: 210
Illegal error code: 211
Illegal error code: 212
Illegal error code: 213
Illegal error code: 214
Illegal error code: 215
Illegal error code: 216
Illegal error code: 217
Illegal error code: 218
Illegal error code: 219
Illegal error code: 220
Illegal error code: 221
Illegal error code: 222
Illegal error code: 223
Illegal error code: 224
Illegal error code: 225
Illegal error code: 226
Illegal error code: 227
Illegal error code: 228
Illegal error code: 229
Illegal error code: 230
Illegal error code: 231
Illegal error code: 232
Illegal error code: 233
Illegal error code: 234
Illegal error code: 235
Illegal error code: 236
Illegal error code: 237
Illegal error code: 238
Illegal error code: 239
Illegal error code: 240
Illegal error code: 241
Illegal error code: 242
Illegal error code: 243
Illegal error code: 244
Illegal error code: 245
Illegal error code: 246
Illegal error code: 247
Illegal error code: 248
Illegal error code: 249
Illegal error code: 250
Illegal error code: 251
Illegal error code: 252
Illegal error code: 253
Illegal error code: 254
Illegal error code: 255
知道了这些退出码之后自己写shell程序的时候就可以选择适当的退出码了!
最近几天一直在研究Bash编程
下面是我写的一个小小的功能脚本:可以通过该命令来将指定文件的指定行的附近的10行显示出来,如果你使用过gdb就知道有个叫做list的命令因此我把它一直到shell中来了当然你可以通过cat来查看文件但是如果文件比较大呢你是不是要翻很多页,多麻烦是吧!
下面提供代码:
$cat list
#! /bin/bash
# name: list
# usage: list 10 lines around the line as given
if [ $# -eq 0 -o $# -eq 1 ]
then
echo -n "Usage: list [number] [file]"
echo " list lines around number as given"
exit 1
fi# copy the located arguments
line=$1
filename=$2# count the total lines
# @para $1 file name
# @return total lines of file given as {@para $1}
total_lines()
{
while read tmp
do
lines=`expr $lines + 1`
done < $1
return $lines
}total_lines $filename
if [ $line -gt $? ]
then
echo "line $line has overflowed the range of $filename"
exit 2
fi# list lines around it
# @para $1 line number
# @para $2 file name
list_lines()
{
exec 3< $2 #open read pipe and close it in _LINE_ 87
num=1 #first line#{@para $1} less than or equal to 5 or not
#echo lines before {@para $1} (included)
if [ $1 -le 5 ]
then
while [ $num -le $1 ]
do
if read str <& 3
then
echo "$num $str"
num=`expr $num + 1`
continue
fi
break
done
else
tmp=`expr $1 - 5`
while [ $num -le $tmp ]
do
read str <& 3
num=`expr $num + 1`
done
tmp=`expr $num + 5`
while [ $num -lt $tmp ]
do
if read str <& 3
then
echo "$num $str"
num=`expr $num + 1`
continue
fi
break
done
fi
#echo "trap here" # trap here#echo the following lines
tmp=`expr $num + 5`while [ $num -lt $tmp ]
do
if read str<& 3
then
echo "$num $str"
num=`expr $num + 1`
continue
fi
break
done
exec 3<&-
}list_lines $line $filename
$chmod 755 li
$./list 45 list
41
42 #{@para $1} less than or equal to 5 or not
43 #echo lines before {@para $1} (included)
44 if [ $1 -le 5 ]
45 then
46 while [ $num -le $1 ]
47 do
48 if read str <& 3
49 then
50 echo "$num $str"
额,对了,上面的注释部分是用英文写的本人CET6还没过的写不出什么水平的,另外有些注释是仿照Java API注释写本人不是很熟悉,只能写出个大概意思了!
虽然网上的vim插件安装的博文相当的多,但是还是自己经过N久摸索出来的比较的有成就感。当然最大的vim资源当然是官网了:http://www.vim.org/download.php,所谓神器也就只有圣者才能很好的驾驭,那么想成为一个圣者就应该认真的研究/doc文件了。
对于插件ctags
1.安装
其实比较的简单因为可以可以从软件包中定位
$sudo apt-get install ctags
接下来当然是输入密码安装了,不过我在想window下的gvim呢,这不是蛋疼么?
好的对于上面的方法我们直接忽略,来看看自己下载的tar归档文件时怎么整的。
首先下载ctas文件:http://ctags.sourceforge.net
$ tar -xzvf ctags-5.6.tar.gz
$ cd ctags-5.6
$ make
# make install // 需要root权限
啥,不会用tar,你out了,好吧,那我们来生成一个deb文件(就像是window下的.exe文件)
记住alien指令,别以为它叫陌生你就可以对它陌生了。
alien - Convert or install an alien binary package(意思就是转换或安装alien安装包)至于用法就自己看手册吧!!
言归正传,make install 之后我们会发现屏幕反馈了一下信息:
cp ctags /usr/bin/ctags && chmod 755 /usr/bin/ctags
当然还有其他的信息,我们只要这个文件其他的我才不管呢。发现没有ctags有可执行属性那么是不是和$sudo apt-get install ctags后的指令相同呢,right!
但是我该怎么用呢,如果你用的是$sudo apt-get install ctags你就可以用man手册看看用法,我这里就引用几句:
name: ctags - Generate tag files for source code
discription: The ctags and etags programs (hereinafter collectively referred to as ctags, except where distinguished) generate an index (or "tag") file
for a variety of language objects found in file(s). This tag file allows these items to be quickly and easily located by a text editor or other utility. A "tag" signifies a language object for which an index entry is available (or, alternatively, the index entry created for that object).
source list: …By default, all other files names are ignored. This permits running ctags on all files in either a single directory (e.g. "ctags *"), or on
all files in an entire source directory tree (e.g. "ctags -R"), since only those files whose names are mapped to languages will be scanned…
这几句说的很明白从ctags是用来给源代码生成tag文件的,那么tag有什么用呢,请看上面指示:index(or “tag”)就是说tag file 是一个索引文件——语言文件中的对象的索引!通过这个索引对象我们就可以快速的定位对象的定义!啥,这不是VS中的工具么。对,现在你不用羡慕VS了。那么是不是这样就可以了呢,你会发现<C-]>一下毛都没有,坑爹啊!不急还没说完呢,请继续往下看。
可以对所有的文件或文件夹执行ctags指令,至于文件夹实际上就是对多个文件(至于哪些文件可以用ctags –list-maps查看一下)进行索引,然后在当前目录下生成一个tags文件,这不就是我们折腾了这么久的东西么!然后呢是不是就可以了呢,是的打开vim之后:set tag={刚才生成的tags文件的目录}一下就可以了,尝试一下,打开tag索引的源文件
,随便找到一下函数<C-]>一下,发生了什么我的光标呢,原来在函数的定义处,哈哈,这么神奇!还有么,?有的,:help ctags看看就行了。当你新定义了一个函数的时候呢发现对这个函数没有用了,是的你必须重新制作一个tags文件,擦是不是很坑爹!不,要看你怎么用了。
再介绍一个简单点的指令gD就是跳转到定义处,啥就这么简单,我刚才还折腾了那么久呢?是的,但是呢它跳转的不是完全的定义处,而是第一次出现的地方(声明或定义)。
码字真累啊!
最近一直对内存管理比较的模糊,因此专门学习了一下,下面是我的一些心得和体会拿来和大家一起分享如有不同的见解期望大家的指点。
我们都知道在C++内存管理中有5个分区(如有不知道的推荐阅读:http://www.cnblogs.com/qiubole/articles/1094770.html),也正因为种类太多才弄的比较的模糊。
为了方便区分我这里只用了堆和栈来识别他们的功能,事实上也是这么回事,广义的栈是指那些系统自动申请和回收的内存空间只在他们相应的作用域内存在;堆是指那些使用new/delete操作符以及malloc()/free()函数手动申请和释放的动态内存空间。在C++中想要安全而随意的使用这些东西并不是一件容易的事情,因为如果不是很熟练的话就容易造成内存泄露不像Java中的只需要new来申请引用类型空间释放就是JVM调用GC的事情了,当然如果你牛逼的话就会感觉到这些工具的强大。
还是来个实例更好的解释:参数传递机制。
参数的传递实际上就是将实参给形参(临时变量存在栈内存空间里)初始化,同样函数返回也是同样的效果用函数返回值来赋值给左操作数(对于引用就是右操作数来修改函数的返回变量)。
注意在下面的例子中指针引用就像是java类型引用是一个指向内存空间的地址,C++引用就是一个别名:
int oi = 1;
int* opi = &i;
void f(int ii){//修改ii}
void g(int* ipi){//修改ipi}
f(oi);//相当于int ii = oi;修改ii不影响oi的值,在函数返回之后系统回收ii的内存空间
f(*opi);//相当于int ii = *opi;修改ii不影响opi
g(opi);//相当于int* ipi = opi;修改ipi不影响opi的值,因此函数结束的时候回收ipi时不会影响opi,但是如果ipi值不修改而直接修改*ipi那么就会修改oi的值
int* h(){int temp = 0;return &temp;}
opi=h();//试图返回一个指向栈内存空间的指针引用,首先return让opi得到了&temp但是函数结束后会回收栈的内存空间那么temp就会无效同样&temp也就无效了
int& m(int& temp){return temp;}
m(oi) = 0;//试图返回一个栈内存变量的别名引用来修改返回变量,首先int& temp = oi;进行引用绑定然后返回temp赋给外部引用然后在进行修改,但是返回temp之后函数结束了就会回收这部分内存同样外部引用就无效了。
接下来看看new的使用:
int* pc = new char[5];//意思就是用new来申请5个char型的动态内存空间并返回首地址赋给栈内存变量pc,在变量的作用域结束的时候堆的内存空间需要自己手动释放
delete []pc;//是指释放pc的值指向的堆内存空间,然后随机重新给pc赋值一个未知地址!
pc= NULL;//让pc指向一个安全的地址NULL
在自定义类型实例化的时候调用构造函数在对象结束的时候系统自动调用默认析构函数,如同上面的栈内存变量!但是如果自定义类型使用了new来申请堆内存空间的话那么默认析构函数就不会调用delete了因此要自己重写析构函数来释放堆内存
template<class T >
class TestClass
{//simple constructor
public:
TestClass():_p(0){}
TestClass(const T & p):_p(new T(p)){}//重写operator new()
~Test(){delete _p;}//重写operator delete()
//new and delete operator
Void * operator new(size_t size);
Void operator delete();
//other members here
private:
T * _p
};
Template<class T>
Void * TestClass<T>::operator new(size_t size)
{
Void * p=malloc(size);
Return p;
}
Template<class T>
Void TestClass<T>::operator delete()
{
Free(_p);
}
int main()
{
TestClass<int> ptr = TestClass<int>(1);
//使用ptr
}
上面的ptr是栈内存变量在程序结束的时候系统自动调用析构函数回收它的内存,同样调用构造函数的时候申请了堆内存空间调结束的时候调用了析构函数释放了这块堆内存空间。
const_cast转换符是用来移除变量的const或volatile限定符
const_cast就可以直接使用显示转换(int*)来代替:
#include<iostream>
using namespace std;
int main()
{
const int a = 1; //a的值永远不变
const int* t = &a; //t的值永远不变,但是*t可能改变
int* b = const_cast<int*>(t);//效果和int* b = (int*)(t)一样
*b = 2;
cout<<a<<"\t"<<*t<<"\t"<<*b<<endl;
cout<<&a<<"\t"<<t<<"\t"<<b<<endl;
}
--------------------------------------------------------------------------------
1 2 2
0xbfc96b1c 0xbfc96b1c 0xbfc96b1c
--------------------------------------------------------------------------------
#include<iostream>
using namespace std;
int main()
{
const int a = 1;
int c = 2;
const int* t = &a;
int* b = const_cast<int*>(t);
//*b = 2;
b = &c;
cout<<a<<"\t"<<*t<<"\t"<<*b<<endl;
cout<<&a<<"\t"<<t<<"\t"<<b<<endl;
}
--------------------------------------------------------------------------------
1 1 2
0xbfb46b5c 0xbfb46b5c 0xbfb46b58
--------------------------------------------------------------------------------
从这里我们可以很明显的看到其中的区别
在C++中类型转换的类型有:传统转换方式及用户自动转换、const_cast、reinterpret_cast、static_cast、dynamic_cast
显然设置这样的语法当然是有他们自己无可替代的作用了,参见C++类型转换方式总结 。
在C++中我觉得数据类型是一个比较抽象的概念,我不知道是不是可以这样说:凡是可以用typedef来重命名的类型都可以看成是数据类型
typedef short Int16;
typedef int Int32;
typedef long int64;
typedef int* pInt;
typedef int& rInt;
typedef const int* const_point;
typedef const int& const_reference;
甚至一些表达式:
typedef expression(type_name,logic);//可以用type_name(是否一定是为变量?)来表示expression逻辑类型
e.g.void (*sigal(int,void (*)(int)))(int);
上式可以分解如下:typedef void (*HANDLER)(int);
HANDLER signal(int,HANDLER);
还有形如typedef typename T::type type也是
用户自定义转换就是模仿传统转换方式对自定义类型定义传统模式的转换方式,姑且起名为外部数据类型内部化。
如:int a = ‘a’+1;//char to int: implicit
int b = 1+(double)(1.1);// b=2, double to int: explicit
class Complex{/*…*/};
Complex a(1,1),b;
b = a+1;//int to Complex
至于剩下的那些可以从字面上看出他们的用途:类型转换(2)