linux
文章平均质量分 54
huangshanchun
机会比实力重要,实力不够的时候,肯定会流失机会。
展开
-
Linux shell 学习(一)
在linux shell 赋值和判断都是等号来表示,它是通过空格来区别二者的不同,var=value表示赋值,等号的左右两边没有空格,而判断var = value,等号的左右两边都有空格。环境变量是未在当前的进程中定义,而从父进程中继承而来的变量。export 命令用来设置环境变量,支持之后,从当前的shell脚本执行的任何应用程序都会继承这个变量。我们可以按照自己的需要,在执行的应用程序原创 2016-04-17 11:48:15 · 503 阅读 · 0 评论 -
多路转接模型之poll
poll系统调用和select类似,也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪者。poll和select效率差不多,只是其使用接口相对简单些,poll不在局限于1024个文件描述符,poll监听事件和触发事件分开,event表示监听事件,revents表示触发的事件。相比select不用每一次都需要重新设置监听事件。 #include int poll(struct原创 2015-08-13 11:04:34 · 884 阅读 · 0 评论 -
linux下pthread_cancel无法取消线程的原因
一个线程可以调用pthread_cancel终止同一进程中的另一个线程,但是值得强调的是:同一进程的线程间,pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消线程下次系统调用时,才会真正结束线程。或调用pthread_testcancel,让内核去检测是否需要取消当前线程。被取消的线程,退出值,定义在Linux的pthread库中常数PTHREAD_CANCELED的值是-1。原创 2015-08-12 10:16:49 · 16865 阅读 · 1 评论 -
linux目录操作及递归遍历目录
目录相关函数介绍//mkdir 函数创建目录#include #include int mkdir(const char *pathname, mode_t mode);//rmdir 删除目录#include int rmdir(const char *pathname);//dopendir/fdopendir //打开目录DIR是一个结构体,原创 2015-07-30 09:20:06 · 4335 阅读 · 0 评论 -
多路I/O转接之select模型
I/O复用使得程序能够同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序同时处理或者监听多个socket文件描述符的时候可以考虑使用I/O复用模型。值得强调的是,I/O复用虽然能够同时监听多个文件描述符,但它本身是阻塞的。当有多个文件描述符就绪的时候,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这使得服务器程序看起来像串行工作的。如果要实现并发,只能够使用多进程或者多线程的手段。原创 2015-08-10 16:42:52 · 1190 阅读 · 0 评论 -
waitpid和SIGCHLD信号回收僵尸进程
对于多进程而言,父进程一般需要跟踪子进程的退出状态。因此当子进程结束运行时,内核不会立即释放该进程的进程表的表项。以满足父进程后续对子进程退出的信息查询(死后验尸),当然前提是父进程还在运行。在子进程结束之后,父进程读取其退出状态之前,我们称该子进程处于僵尸态(用户空间已经被释放,其不能被调度)。原创 2015-08-09 08:28:28 · 4092 阅读 · 0 评论 -
ioctl函数理解
ioctl 是设置和获取设备文件的物理特性,不同设备文件其物理特性不一样。比如串口的波特率,显示器分变率等。值得说明的是fcntl 与ioctl不同在于fcntl是描述文件访问控制属性而ioctl是操作文件的物理特性。可以简单理解fcntl是操作文件共性,ioctl是操作文件的个性。#include int ioctl(int fd, int request, ...);下面原创 2015-06-14 21:04:47 · 2661 阅读 · 0 评论 -
Linux系统lseek函数作用
首先看下函数: off_t lseek(int fd, off_t offset, int whence); 所需要头文件: #include #include 参数:fd 表示要操作的文件描述符offset是相对于whence(基准)的偏移量whence 可以是SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置) ,SEEK原创 2015-07-02 21:21:04 · 22980 阅读 · 0 评论 -
文件I/O之C标准库函数和系统库函数区别
1.首先C标准库函数是工作在系统库函数之上的。C标准库函数在读写文件时候都有一个文件流指针。FILE*fp=NULL;// fp=fopen(F_PATH,"r"); fp文件流指针,其指向结构体如下图所示。文件描述符指向磁盘文件,在进行文件读写操作时候是先读写到缓冲区,然后再调用系统应用层API write函数进行写操作,write将文件内容写到内核缓冲区,然后再调用内核层API原创 2015-06-06 15:34:06 · 3227 阅读 · 0 评论 -
linux下虚拟文件系统
Linux支持各种各样的文件系统格式,如ext2、ext3、reiserfs、FAT、NTFS、iso9660等等,不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统都可以mount到某个目录下,使我们看到一个统一的目录树,各种文件系统上的目录和文件我们用ls命令看起来是一样的,读写操作用起来也都是一样的,这是怎么做到的呢?Linux内核在各种不同的文件系统格式之上原创 2015-08-03 22:02:09 · 711 阅读 · 0 评论 -
Linux 下信号理解(一)
Linux提供了信号传递进程消息的机制,什么是信号?它是一种非常短的消息,短到只有一个数字。值得强调的是信号和信号量只少了一个字,但他们完全是不同的概念,信号量仅用于同步代码段,而信号则用于传递消息。信号的编号:通过kill -l 命令可以看到原创 2015-08-04 21:52:24 · 1657 阅读 · 0 评论 -
Bash空格的那点事
原文出自:http://www.igigo.net/post/archives/152空格,一个看不见的字符,很不起眼,也正由于不起眼,很多人经常忽略它,导致代码出错,却还找不着北。这里,我们来聊聊bash中空格的那点事。先了解下bash中什么时候该用空格,什么时候不该用。1. 等号赋值两边不能有空格2. 命令与选项之间需要空格3. 管道两边空格可有可无我们来看看常见的转载 2016-03-24 10:01:21 · 627 阅读 · 0 评论 -
Linux脚本编程:Bash shell脚本的大括号
${name:-default}使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量name;例子unset nameecho ${name:-111}结果111name=222echo ${name:-111}结果222${name:=default}使用指定值来代替空的或者没有赋值的变量name;貌似和上一个一样${name:?message}如转载 2015-10-31 15:13:37 · 971 阅读 · 0 评论 -
基于mmap/munmap内存共享映射机制
由于上次参加腾讯面试的时候,问到这个问题没有回答出来,现在将其总结一下。mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针来做而不需要read/write函数。值得强调的是,可以不可以直接把整个文件映射到内存,这主要取决于你映射的大小,当文件非常大的时候无法映射,不过可以分块映射。原创 2015-09-17 10:24:00 · 1302 阅读 · 0 评论 -
linux 线程同步(二)
信号量信号量是互斥锁的升级版把互斥锁中1变成了n,举个简单的例子:假设现在有10个人,有一部手机,这10个人都竞争来使用手机打电话这就是互斥锁。对于信号量,现在可能是有4部手机,这10个人都竞争来使用手机打电话。相比互斥锁信号量由1变成了4。信号量相也就是操作系统中pv操作,它广泛应用进程或者线程间的同步与互斥。原创 2015-08-18 21:05:42 · 1534 阅读 · 0 评论 -
多路I/O转接之epoll模型
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了,因此性能得到很大的提高。对于多文件描述符而且都处于大量活跃情况下,其性能提升的并不高,性能和poll差不多。对于新原创 2015-09-01 10:20:37 · 848 阅读 · 0 评论 -
Linux 信号理解(二)
linux下信号基本概念见,Linux 信号理解(一)原创 2015-08-05 20:20:41 · 1262 阅读 · 0 评论 -
Linux 下stat和access函数
stat既有命令也有同名函数,用来获取文件Inode里主要信息(即文件类型),stat 跟踪符号链接,lstat不跟踪符号链接。可以通过man 2 stat查看相关的信息。 #include #include #include int stat(const char *path, struct stat *buf);int fstat(int fd, struc原创 2015-07-25 15:47:36 · 3005 阅读 · 0 评论 -
Makefile:1: *** 多个目标匹配。 停止。
下面是我自己写的Makefile 文件:.SUFFIXES:.c .oCC = gccSRCS = stat.cOBJS = $(SRCS:.c=.o)EXEC = teststart:$(OBJS) $(CC) -g -o $(EXEC) $(OBJS).c.o: $(CC) -Wall -g -o $@ -c $<clean: rm -f $(OBJS)make的时原创 2015-07-25 09:05:11 · 5404 阅读 · 0 评论 -
Linux 线程同步(一)
线程为什么要同步1.共享资源,多个线程可以对共享资源操作2.由于并发原因,线程操作共享资源操作顺序不一样,可能会造成脏数据3.处理器对存储器的操作一般不是原子操作。临界区(Critical Section) 临界区为了保证在某一时刻只有一个线程能访问数据的简便方法,在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图同时访问同时访问临界区,那么在有一个线程进入原创 2015-08-15 22:03:00 · 1287 阅读 · 0 评论 -
linux平台下C语言实现一个简单的httpsever
一.HTTP请求和应答的步骤HTTP是基于TCP协议的短连接,一般为以下四步:第一步、client通过tcp协议连接到server端;第二步、client给server发送请求request(client一个连接只给server发一次request请求);第三步、server给client回复reponse;第四步、双方断开连接注:(client如果想再次给server发送原创 2015-05-13 13:03:12 · 10401 阅读 · 5 评论 -
ext2文件系统寻址
ext2 文件系统相关介绍:ext2文件系统,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是数据块中。但是文件名存在哪里,首先文件名不是存在inode中的,那么文件名存在哪里?这里我们可以看到目录大小都为4096,当你创建一个目录的时候操原创 2015-04-10 18:57:04 · 1579 阅读 · 0 评论 -
linux 下最近访问、最近更改、最近改动时间理解
首先我们可以使用touch 建立一个文件 例如:touch test 并使用stat命令看下时间。可以看到:最近访问:2015-03-24 19:41:30.028718709 +0800最近更改:2015-03-24 19:41:30.028718709 +0800(是指最近修改文件内容的时间)最近改动:2015-03-24 19:41:30.028718709 +080原创 2015-03-24 20:04:43 · 3047 阅读 · 0 评论 -
linux ulimit使用
inux ulimit使用ulimit -a 用来显示当前的各种用户进程限制。Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:ulimit -u 10000对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,最好通过使用转载 2015-01-05 19:27:43 · 3447 阅读 · 0 评论 -
Linux 下文件描述符(二)
编程中应该使用中定义的STDIN_FILENO、STDOUT_FINENO、STDERR_FILENO 三个宏来表示0,1,2.在程序中可以使用close来关闭STDOUT_FINENO(标准输出),然后再使用open系统调用打开设备或者文件,则其对应的文件描述符则为1,此时系统就会将其作为标准输出。使用putty或者别的工具打开两个终端。在其中的一个终端中输入tty。在使用ope原创 2015-01-26 14:58:38 · 988 阅读 · 0 评论 -
GDB调试精粹
一、列文件清单list / l列出产生执行文件的源代码的一部分[cpp] view plaincopy//列出 line1 到 line2 行之间的源代码 (gdb) list line1, line2 //输出从上次调用list命令开始往后的10行程序代码 (gdb) list //输出第 n 行附近的10行程序代码 (gdb) li转载 2015-01-26 21:03:23 · 603 阅读 · 0 评论 -
Linux下文件描述符(一)
Linux系统一切皆文件(目录、字符设备、块设备、 套接字、打印机等)屏蔽了硬件的区别,所有设备都抽象成文件,提供统一的接口给用户。这就是“一切皆是文件”的思想,因此文件描述符也非常重要。文件描述符是个最小的正整数,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。每个进程启动时候都打开三个文件:1.标准输入文件(stdin)2.标准输出(stdout)3.标准出错(stder原创 2015-01-20 17:48:55 · 861 阅读 · 0 评论 -
shell中的括号
在编写shell scripts时,经常会用到括号,各种括号,各种用法。一、括号、圆括号() 1、单小括号。 ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。 ②命令替换。等同于`cmd`,shell扫描一遍命令行,发转载 2015-01-24 15:05:51 · 660 阅读 · 0 评论 -
Makefile中include、-include、sinclude的区别
如果指示符“include”指定的文件不是以斜线开始(绝对路径,如/usr/src/Makefile...),而且当前目录下也不存在此文件;make将根据文件名试图在以下几个目录下查找:首先,查找使用命令行选项“-I”或者“--include-dir”指定的目录,如果找到指定的文件,则使用这个文件;否则继续依此搜索以下几个目录(如果其存在):“/usr/gnu/include”、“/usr/loc转载 2014-12-16 16:17:45 · 1013 阅读 · 0 评论 -
Makefile 中:= ?= += =的区别
原文出自:http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验新建一个Makefile,内容为:ifdef DEFINE_VRE VRE = “Hello World!”else转载 2014-11-25 22:57:47 · 671 阅读 · 0 评论 -
linux权限补充:rwt rwT rws rwS 特殊权限
原文出自:众所周知,Linux的文件权限如: 777;666等,其实只要在相应的文件上加上UID的权限,就可以用到加权限人的身份去运行这个文件。所以我们只需要将bash复制出来到另一个地方,然后用root加上UID权限,只要用户运行此Shell就可以用用root的身份来执行任何文件了一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属转载 2014-07-17 22:24:44 · 1225 阅读 · 0 评论 -
根据需要来调整inode的节点数量
本文转自http://linux.chinaitlab.com/administer/786497.html在Linux操作系统中,其文件结构跟微软操作系统有比较大的差异。在Linux操作系统中,采用的是一种叫做inode的节点结构。在这个inode节点中,记录了文件的类型、大小、权限、所有者、文件连接的数目、创建时间与更新时间等重要的信息,还有一个比较重要的内容就是指向数据块的指针。一般情况转载 2014-07-27 10:47:00 · 3605 阅读 · 0 评论 -
学习写Makefile文件
由简单到复杂一步步来编写Makefile文件。Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。。在 Linux(unix )环境下使用GNU 的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为Makefile 文件的编写。原创 2015-01-10 21:12:10 · 1048 阅读 · 0 评论 -
Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D
在源代码里面如果这样是定义的:#ifdef MACRONAME//可选代码#endif那在makefile里面gcc -D MACRONAME=MACRODEF或者gcc -D MACRONAME 这样就定义了预处理宏,编译的时候可选代码就会被编译进去了。对于GCC编译器,有如下选项: -D macro=string,等转载 2015-01-12 16:37:29 · 2423 阅读 · 0 评论 -
Linux fork()系统调用
需要头文件: #include // man 2 fork 查看需要什么头文件函数原型:pid_t fork(void); //这里pid_t 就是整形 其在#include函数返回值:-1 出错。成功后其在子进程中返回0,父进程中返回子进程pid。这里可以理解为fork执行成功后其返回子进程pid,如果没有子进程则返回0。fork()执行成功后,向父进程返回子进程原创 2015-01-31 23:09:51 · 1055 阅读 · 0 评论 -
Linux进程通信-共享内存
对于linux来讲,不同进程之间的内存是不能读写的,一个进程只能读写自己所属的内存。A进程是不能读写B进程内存的?如果程序确实想通过内存交换数据怎么办?linux提供共享内存机制。共享内存是由内核处于多个进程间交换信息的目的而留出的一块内存区(段)。共享内存也需要设置相关权限的。这段内存空间可以由需要访问的进程将其映射到自己的私有地址空间。如果一个进程更新了段中数据,其他进程也能立即看到更新。因为原创 2015-02-03 13:20:44 · 1130 阅读 · 0 评论 -
linux/Windows 基于TCP协议的文件传输源码(有注释)
使用条件编译可以分别在windows上和linux编译成功,基于TCP协议,使用socket通信技术。由于以二进制形式进行文件的读写,所有可以实现任意文件的传输。实现客户端发送,服务端接受文件。测试环境windows7 vs2010,Ubutun14.04 gcc 在windows 使用vs2010 编译时::在pub.c 文件开头加#define WIN在linux 使用gcc原创 2015-03-07 19:26:27 · 2986 阅读 · 1 评论 -
ext2 文件系统
我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息。首先来看一个简单文件系统,硬盘的读写以扇区为基本单位一个扇区的大小为512Byte。如下图所示一个hello文件要存在磁盘上,需要保存文件名,文件的起始位置,文件大小等信息。一个真正的文件系统远远比这复杂,文件系统原创 2015-03-25 18:30:34 · 1426 阅读 · 0 评论 -
linux下用top命令查看cpu利用率超过100%
linux下用top命令查看cpu利用率超过100%这里显示的所有的cpu加起来的使用率,说明你的CPU是多核,你运行top后按大键盘1看看,可以显示每个cpu的使用率,top里显示的是把所有使用率加起来按下1后可以看到我的机器的CPU是双核的。%Cpu0,%Cpu1这里我们也可以查看一下CPU信息:在命令行里输入:cat /proc/cpuinfo这里可以看到原创 2015-03-18 08:55:59 · 163641 阅读 · 8 评论 -
Linux 下基于多线程服务器/客服端聊天程序源码
Linux 下基于多线程服务器/客服端聊天程序,采用阻塞的socket技术,和多线程技术实现。客服端程序:client.c#include#include#include#include #include #include #include #include#include#include#define BUFFSIZE 1024#define ERRORCODE -原创 2015-03-01 13:12:41 · 1569 阅读 · 0 评论