标准输出指的是命令执行所传回的正确的信息,而标准错误输出可理解为命令执行失败后,所传回的错误信息。   标准输出(stdout)和标准错误输出(stderr),默认都是输出到屏幕上来,数据流重定向可以将stdout和stderr分别传送到其他的文件或设备去。   分别传送所用的特殊字符如下:  stdin:0,使用 < 或 <<  stdout:1,使用 > 或 >> 注:仅存在>时,代表默认的代码1  stderr:2,使用2> 或 2>> 例如执行命令:ll /home > ~/testfile 屏幕上无任何信息,因为原本“ll /home”显示的数据被重新导向~/testfile文件中了。 文件创建方式: 若以 > 输出到一个已经存在的文件中,那么这个文件就会被覆盖,若不存在,系统就会自动创建。与 >> 的区别是,>> 不会覆盖,而是在最下方累加进去。stderr 同理 例如:执行find命令经常会由于权限的原因产生错误信息. 继续阅读 >>


杜肖孟 16/07/28 17:12:35
咱们从普通用户修改密码说起。 我们知道linux用户修改密码,最终修改的是/etc/shadow这个文件。可是我们用 ll /etc/shadow命令查看会发现此文件的权限为000,如下图: 也就是说,非root用户对此文件没有任何权限。 那矛盾就产生了:linux普通用户是有权限修改自己密码的,而普通用户又不俱备对/etc/shadow这个文件的任何权限。 linux操作系统为了解决这一问题,就产生了setUID权限。 我们了解在linux系统下,用户修改密码(也就是修改/etc/shadow文件)是通过passwd(此命令文件的绝对路径为/usr/bin/passwd,可以通过which passwd查看)这个命令的。我们用ll /usr/bin/passwd看一下此命令文件的权限,如下图: 发现/usr/bin/passwd的权限为:-rwsr-xr-x. 1 root root 在此“文件所有者”的第三位是s权限,也就是咱们本文提到的setUID权限。 回到咱们上面提出的问题,普通用户是怎么修改权限的。普通用户对/etc/shadow 继续阅读 >>


杜肖孟 16/07/28 11:33:57
编译器函数库自带的快速排序函数。 qsort()的函数原型是 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针 例1:对一个长为1000的数组进行排序时,int a[1000];  qsort(a,1000,sizeof(int),comp); 其中comp函数应写为: 1 2 3 4 int comp(const void*a,const void*b) { return *(int*)a-*(int*)b; } 例2: 对一个二维数组进行排序: int a[1000][2];   1 2 3 4 5 6 7 qsort(a,1000,sizeof(int) 继续阅读 >>


杜肖孟 16/07/27 16:30:41
S_ISLNK(st_mode):是否是一个连接. S_ISREG是否是一个常规文件. S_ISDIR是否是一个目录S_ISCHR是否是一个字符设 备. S_ISBLK是否是一个块设备 S_ISFIFO是否 是一个FIFO文件. S_ISSOCK是否是一个SOCKET文件  man 2 stat ...  struct stat {              dev_t st_dev;                                 &nbs 继续阅读 >>


杜肖孟 16/07/27 08:16:36
linux系统提供了详细的帮助手册,我看到 man 2 link  这一命令,对中间的  2 感到一些疑惑,就在网上查了一下,分享给大家。 man手册分为多个section,每个section用一个字符表示。 这里的section可以理解为类别,例如:man 1 passwd 和 man 5 passwd是不一样的类别(详细见表)。通常我们使用man passwd,这个时候man就按照预先设置的搜索路径和顺序去搜索passwd,当搜索到一个就停止继续搜索并将结果显示出来,如果我们指定了section,那么man只会在指定的section里去查找man帮助页。 作者:Tanswer_ 发表于2016/7/25 14:05:45 原文链接 阅读:13 评论:0 查看评论 继续阅读 >>


杜肖孟 16/07/25 14:05:45
open系统调用 #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int open(const char *path,int oflags); int open(const char *path,int oflags, mode_t mode); 简单的说,open建立了一条到文件或设备的访问路径,如果调用成功,它将返回一个可以被read,write和其他系统调用使用的文件描述符。 --------------------------------------------------------------------------------------------------------------------------------------- oflags 参数用于指定打开文件所采取的动作。它是通过必需文件访问模式与其他可选模式相结合的方式来指定的。 必需文件访问模式: O_RDONLY 以只读方式打开 O_WRONLY 继续阅读 >>


杜肖孟 16/07/25 11:38:50
1.1 目录   文件,除了本身的内容外,它还会有一个名字和一些属性,包括文件的创建/修改日期和它的访问权限,这些属性被保存在inode节点中,它是文件系统中的一个特殊的数据块,它同时还包含文件的长度和文件在磁盘上的存储位置。系统使用的是文件的inode编号,为文件命名仅仅是为了便于人们使用。   目录是用于保存其他文件的名字和节点号的文件。目录文件中的每个数据项都是指向某个文件节点的链接,删除文件名就等于删除与之对应的链接。删除一个文件时,实质上是删除了该文件对应的目录项,同时指向该文件的链接数减一,该文件中的数据块可能仍然能够通过其他指向同一文件的链接访问到。   文件被安排在目录中,目录中还可能还有子目录,这就构成了我们熟悉的文件系统层次结构。根目录(/)位于目录层次的最顶端,根目录中通常包含用于存放系统程序的 /bin,用于存放系统配置文件的 /etc,存放系统函数库的 /lib 等子目录。 ------------------------------------------------------------------------------- 继续阅读 >>


杜肖孟 16/07/25 09:55:39
本节为大家介绍我了解的 make 是如何工作的=_= 在默认的方式下,也就是我们只输入make命令。那么, 1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它会找文件中的第一个目标文件(target),在上节的例子中,他会找到“myapp”这个文件,并把这个文件作为最终的目标文件。 3、如果myapp文件不存在,或是myapp所依赖的后面的 .o 文件的文件修改时间要比myapp这个文件新,那么,他就会执行后面所定义的命令来生成myapp这个文件。 4、如果myapp所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程) 5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件myapp了。       这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻 继续阅读 >>


杜肖孟 16/07/15 15:59:17
make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具。 makefile文件由一组依赖关系和规则构成。 makefile的规则:先写目标的名称,然后紧跟这一个冒号,接着是空格或者制表符tab,最后是用空格或者制表符tab隔开的文件列表(这些文件用于创建生成目标文件)。 target ... : prerequisites ... command ... ... 目标文件可以是中间目标文件,也可以是可执行文件,还可以是标签、伪目标。 command也就是make需要执行的命令(任意的shell命令)。 prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。 例如:编写文件Makefile1   myapp: main.o 2.o 3.o gcc -o myapp main.o 2.o 3.o main.o:main.c a.h gcc -c main.c 继续阅读 >>


杜肖孟 16/07/15 15:18:15
动态存储方式 所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。 静态存储方式 所谓静态存储方式是指在程序编译期间分配固定的存储空间的方式。该存储方式通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。全局变量,静态变量等就属于此类存储方式。 总结 从以上分析可知, 静态存储变量是一直存在的, 而动态存储变量则时而存在时而消失。我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。 生存期表示了变量存在的时间。 生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别。 一个变量究竟属于哪一种存储方式, 并不能仅从其作 继续阅读 >>


杜肖孟 16/07/09 19:30:43