Linux
文章平均质量分 56
继续微笑lsj
眼界决定未来
展开
-
小议同步IO :fsync与fdatasync
对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才认定事务提交成功并返回给应用层。一个简单的问题:在*nix操作系统上,怎样保证对文件的更新内容成功持久化到硬盘?1. write不够,需要fsync一般情况下,对硬盘(或者其他持久存储设备)文件的write操作,更新的只是内存中的页缓存(page cache),...转载 2019-04-07 22:09:17 · 371 阅读 · 0 评论 -
怎样通过MSG_WAITALL设置阻塞时间
首先给出MSDN上一段设置阻塞超时的代码:(网址为http://social.msdn.microsoft.com/Forums/zh-SG/visualcpluszhchs/thread/3d9daec0-f000-4bf1-add1-3beab8e398eb)12345678910转载 2015-11-21 22:12:00 · 2179 阅读 · 0 评论 -
Linux socket对EINTR处理
在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interrupted system call. 这里给出一个connect连接中对EINTR处理的网址:http://www.madore.org/~david/computers/connect-intr.html另外转载网络上其他兄弟对EINTR错误的处转载 2015-11-21 21:47:05 · 1167 阅读 · 0 评论 -
linux cgroup
为什么要有cgroupLinux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源。也就是能完成一组容器的概念,在这个容器中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等。于是就出现了cgroup的概念,cgroup就是controller group,最初由google的工程师提出,后来被整合进Linux内核中。Cgroup是将任意进程进行分组化管理的Linu转载 2015-10-11 22:11:20 · 813 阅读 · 0 评论 -
采用dlopen、dlsym、dlclose加载动态链接库
1、前言 为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用,非常方便。本文先从使用上进行总结,涉及到基本的操作方法,关于动态链接库的本质及如何加载进来,需要进一步学习,后续继续补充。如何将程序设计为插件形式,挖掘出主题和业务之间的关系,需要进一转载 2015-10-10 23:22:26 · 592 阅读 · 0 评论 -
linux C语言 getpagesize获得页内存大小
使用getpagesize函数获得一页内存大小系统给我们提供真正的内存时,用页为单位提供,一次最少提供一页的真实内存空间 分配内存空间:你真实的分配了多少内存,就使用多少内存,不要越界使用 但是系统提供的真实内存空间是以页来提供的。[cpp] view plaincopy#include int main()转载 2015-09-17 09:48:24 · 1746 阅读 · 0 评论 -
__FUNCTION__, __func__, __PRETTY_FUNCTION__
http://blog.csdn.net/linuxheik/article/details/7621155Solaris下支持C99的__func__gcc 支持 __FUNCTION__, __func__, __PRETTY_FUNCTION__俺一般使用__FUNC__#if defined (__GNUC__)# define __FUNC__ ((c转载 2015-10-21 13:52:35 · 2374 阅读 · 0 评论 -
Linux .a与.so的区别
在linux平台上编译时,常会遇到目标库的疑问,有静态库也有动态库,单个理解都不太难,但是对复杂的工程而言,一旦混合到一起去,对整个工程的理解和调用,将会造成很大困扰,本文就汇总这几种常见编译结果文件的区别。一、格式说明linux下编译,常会遇到后缀为:.o .so .a .la .ko等格式文件,尽管linux并不以扩展名作为识别文件格式的唯一依据,但规范约定还是有的,如下:转载 2015-09-05 08:30:41 · 4992 阅读 · 0 评论 -
linux之线程局部存储
在Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。那么对于那些系统不支持原子操作的自定义数据类型,在不使用锁的情况下如何做到线程安全呢?本文将从线程局部存储方面,简单转载 2015-09-08 22:18:58 · 559 阅读 · 0 评论 -
SecureCRT设置vim显示颜色
我们日常用SecureCRT工具登陆我们的linux系统,进行各种操作,但是我们发现SecureCRT的色调单一,今天在网上找到了解决这个方法。只需要两个步骤:1) 选项 --> 会话选项 --> 终端 --> 仿真 --> 勾选“ANSI 颜色”。2) 在.bashrc中添加:export TERM=xterm退出后重新连接就可以了。转载 2015-06-10 17:18:02 · 734 阅读 · 0 评论 -
linux下使用free命令查看实际内存占用
linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free -m方式查看内存占用情况(兆为单位)。而系统实际可用内存是不是free部分呢,不是的,系统实际内存占用以及可用内存有如下几个加减法:used=total-free 即 total=used+free实际内存占用:used-buffers-cached即 total-free-buffers-cach转载 2015-06-05 18:55:53 · 1399 阅读 · 0 评论 -
route命令的使用详解
route命令用于显示和操作IP路由表。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是 为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为 Linux机器的默认路由。要注意的是,直接在命令行下执行route命令来添加路由,不会永转载 2015-04-29 23:06:12 · 2377 阅读 · 0 评论 -
非阻塞情况下connect产生EINPROGRESS错误
今天在开发游戏客户端测试程序时,由于出现很多客户端,经过connect成功后,代码卡在recv系统调用中,后来发现可能是由于socket默认是阻塞模式,所以会令很多客户端链接处于链接却不能传输数据状态。后来修改socket为非阻塞模式,但在connect的时候,发现返回值为-1,刚开始以为是connect出现错误,但在服务器上看到了链接是ESTABLISED状态。证明链接是成功的转载 2015-02-16 14:57:28 · 1611 阅读 · 0 评论 -
Linux中用st_mode判断文件类型
在Linux中,可以利用stat()函数来获取一个文件的状态[cpp] view plaincopyprint?#include #include int stat(const char *file_name, struct stat *buf); #include #include int stat(const char *file_n转载 2015-01-25 16:36:29 · 1033 阅读 · 0 评论 -
宏的高级使用
先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等宏变量:先举一个例子,会用到上面这些宏:[cpp] view plaincopy#define myprintf(...) printk("[lch]:File:%s, Line:%d, Function:%s,"转载 2015-11-23 14:41:32 · 483 阅读 · 0 评论 -
linux https代理squid搭建
如何在linux上用squid搭建代理服务器_足够详细 在linux上用squid搭建代理服务器,这个东东全世界都是,但是有一些细节问题在网上说的不明不白的,折腾了半天搞好了,如鲠在喉不吐不快。 一台电脑linux系统,上不了网,于是在另外一台可以上网的linux上面搭建一个代理服务器,步骤如下: 下载:squid-3.2.9.tar.bz2转载 2015-11-25 15:08:59 · 13570 阅读 · 0 评论 -
Linux proc/%d/stat文件详解
[root@localhost ~]# cat /proc/6873/stat6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0转载 2016-02-05 16:48:01 · 694 阅读 · 0 评论 -
linux多线程信号处理
在linux下,每个进程都有自己的signal mask,这个信号掩码指定哪个信号被阻塞,哪个不会被阻塞,通常用调用sigmask来处理。同时每个进程还有自己的signal action,这个行为集合指定了信号该如何处理,通常调用sigaction来处理。使用了多线程后,便有些疑问:信号发生时,哪个线程会收到是不是每个线程都有自己的mask及action每个线程能按自己的方转载 2016-07-04 20:28:50 · 4748 阅读 · 2 评论 -
daemontools
最近用到了daemontools,却发现百度上基本上没有中文版的,特此分享出来给大家,作者的英语水平也不太好,翻译不对的地方请指正。1. 简单介绍一下daemontools 点击查看英文原文daemontools是一个守护进程工具,用来监视一个进程以免其意外退出,例如用来监视某个目录中的一个java程序入口,让它一直处于运行状态。被daemontools守护的进程是无法使用kill指令杀转载 2016-06-29 16:26:30 · 891 阅读 · 0 评论 -
linux inode理解
一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是转载 2016-06-27 22:33:08 · 448 阅读 · 0 评论 -
shell默认参数
通常shell中我们需要给变量设置默认值,可能会写出如下代码Shell代码 #!/bin/bash if [ ! $1 ]; then $1='default' fi 显然这种方式在变量少的时候没啥问题,一旦变量多起来,我们可能就有大量的重复劳动(if判断)有没有比较优雅的方式,不用写一大堆if判断,显然答案是有的转载 2016-05-24 17:52:25 · 5693 阅读 · 0 评论 -
SSH 免登陆
ssh 无密码登录要使用公钥与私钥。linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例。有机器A(192.168.1.155),B(192.168.1.181)。现想A通过ssh免密码登录到B。1.在A机下生成公钥/私钥对。[chenlb@A ~]$ ssh-keygen -t rsa -P ''-P表示密码,-P '' 就表示空转载 2016-04-08 14:07:37 · 503 阅读 · 0 评论 -
linux多行注释
1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式; 2. 在行首使用上下键选择需要注释的多行; 3. 按下键盘(大写)“I”键,进入插入模式; 4. 然后输入注释符(“//”、“#”等); 5. 最后按下“Esc”键。注:在按下esc键后,会稍等一会才会出现注释,不要着急~~时间很短的转载 2016-03-25 12:55:48 · 16303 阅读 · 0 评论 -
实现无锁的栈与队列
怎样实现一个无锁队列,网络上有很多的介绍,其中流传最广,影响最大的恐怕就属于以下两篇论文: a) "Implementing lock free queue" by John.D.Valois b) "Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms" by M.转载 2016-03-31 23:48:48 · 507 阅读 · 0 评论 -
PIPE和socketpair的区别
2013年04月19日 ⁄ 综合 ⁄ 共 1580字 ⁄ 字号 小 中 大 ⁄ 评论关闭管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。socketpair直接就可以实现全双工socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写详间代码:一:pipe实现父子进程全双工通信:#i转载 2016-02-20 15:54:36 · 1660 阅读 · 0 评论 -
两个重要信号
8.5.1 SIGALRM信号 在进行阻塞式系统调用时,为避免进程陷入无限期的等待,可以为这些阻塞式系统调用设置定时器。Linux提供了alarm系统调用和SIGALRM信号实现这个功能。 要使用定时器,首先要安装SIGALRM信号。如果不安装SIGALRM信号,则进程收到SIGALRM信号后,缺省的动作就是终止当前进程。SIGALRM信号安装成功后,在转载 2016-02-20 14:17:47 · 516 阅读 · 0 评论 -
sigprocmask
1、有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。这种情况是通过阻塞信号实现的。2、信号阻塞和忽略信号的区别。阻塞的概念和忽略信号是不同的。操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃。转载 2016-02-20 14:07:39 · 570 阅读 · 0 评论 -
epool如何高效
开发高性能网络程序时,windows开发者们言必称iocp,linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高大发了。我们用起epoll来都感觉挺爽,确实快,那么,它到底为什么可以高速处理这么多并发连接呢?先简单回顾下如何使用C库封装的3个epoll系统调用吧。转载 2016-02-14 15:57:18 · 1297 阅读 · 0 评论 -
mpstat
mpstat 另一个用于获取 CPU 相关统计信息的有用的命令是 mpstat。下面是一个示例输出: # mpstat -P ALL 5 2 Linux 2.6.9-67.ELsmp (oraclerac1) 12/20/2008 10:42:38 PM CPU %user %nice %system %iowait %irq转载 2016-03-01 21:00:39 · 383 阅读 · 0 评论 -
vmstat
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。一般vmst转载 2016-03-01 20:54:50 · 336 阅读 · 0 评论 -
SIGPIPE信号详解
当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试. 但是服务器总是莫名退出,没有core文件.最后问题确转载 2015-02-12 21:02:37 · 1079 阅读 · 0 评论 -
socket tcp 产生 rst响应的情况
socket tcp 产生 rst响应的情况(属于硬错误)1. syn发送到服务器主机,但是目的端口并未运行。则产生一个ECONRFUSED错误。客户端立即返回。比如telnet 192.168.1.55 8889,条件:55主机在局域网上并且可达(也可以换成可以到达的网络ip地址),但是8889这个端口并未使用(可能服务器已经关闭),则服务器(对方主机tcp内核)发送一个rst相应给转载 2015-02-12 21:00:18 · 1468 阅读 · 0 评论 -
关于SIGCHLD信号的处理
进程一章讲过用wait和waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一下,程序实现复杂。其实,子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD转载 2015-02-18 10:42:54 · 1335 阅读 · 0 评论 -
stat命令
在Linux中,没有文件创建时间的概念。只有文件的访问时间、修改时间、状态改变时间。也就是说不能知道文件的创建时间。但如果文件创建后就没有修改过,修改时间=创建时间;如果文件创建后,状态就没有改变过,那么状态改变时间=创建时间;如果文件创建后,没有被读取过,那么访问时间=创建时间,这个基本不太可能。转载 2014-11-11 13:01:42 · 1052 阅读 · 0 评论 -
shell中的四种模式匹配
POSIX为shell为进行模式匹配提供了四种参数替换结构(老版本的shell可能不支持),每种结构有两个参数:变量名(或变量号)及模式。第一种模式: ${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式第二种模式: $转载 2014-11-11 12:43:54 · 5413 阅读 · 0 评论 -
shell中的case语句
类似于其他高级程序语言,Shell中case语句的作用也是作为多项选择使用,语法如下:[plain] case word in pattern1) Statement(s) to be execute if pattern1 matchs ;; pattern2) Statement(s) to b原创 2014-06-08 23:34:40 · 1501 阅读 · 0 评论 -
/dev/null和/dev/zero的用法
现在总结一下/dev/null和/dev/zero的作用和使用实例。在类Unix系统(包括Linux)中,/dev/null 它是空设备,也称为位桶(bit bucket)或者黑洞(black hole)。你可以向它输入任何数据,但任何写入它的数据都会被抛弃。通常用于处理不需要的输出流。(当然,它也可以作为空的输入流)/dev/zero 该设备无穷尽地提供空字符(ASCII转载 2014-03-18 19:15:08 · 1623 阅读 · 0 评论 -
linux系统中各目录详解
Linux /dev目录详解 在linux下,/dev目录是很重要的,各种设备都在下面。下面简单总结一下: dev是设备(device)的英文缩写。/dev这个目录对所有的用户都十分重要。因为在这个目录中包含了所有Linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序,这一点和windows,dos操作系统不一样。它实际上是一个访问这些外部设备的端口。我们可以非常转载 2014-03-18 19:33:35 · 1568 阅读 · 0 评论 -
shell中变量的测试与替换
在某些时刻我们经常需要判断某个变量是否存在,若变量存在则使用既有的设置,若变量不存在则给予一个常用的设置。(1)变量未被设置或者内容为空,则替换为新的内容. new_var=${old_var-content}范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root [root@www ~]# echo $username原创 2013-05-27 23:36:37 · 1749 阅读 · 0 评论 -
shell中正则表达式
看了鸟哥的linux总结一下,以备后面用到。1.一些特殊符号 2.行首控制符^、行尾控制符$找出行首包含the的:[root@www ~]# grep -n '^the' regular_express.txt 开始为小写字母的:# grep -n '^[a-z]' regular_express.txt 那如果我不想要开头是英文字母:# grep -n '^[^a-原创 2013-05-27 23:10:30 · 1468 阅读 · 0 评论