![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 86
iteye_3185
这个作者很懒,什么都没留下…
展开
-
fork的执行
先看看一段fork的程序 int main(){ pid_t pid; 语句 a; pid = fork(); 语句 b;} 1.当程序运行到 pid = fork()时,这个进程马上分裂(fork的中文意思)成两个进程,我们称为父进程和子进程,子进程是父进程的副本,副本的意思是子进程把父进程的数据空间,堆...2008-09-17 00:30:00 · 273 阅读 · 1 评论 -
vim配置文件精简版
"Get out of VI's compatible mode..set nocompatible"Sets how many lines of history VIM har to rememberset history=400"Enable filetype pluginfiletype plugin onfiletype indent on"Set ...2011-09-19 09:37:54 · 96 阅读 · 0 评论 -
关于大端法和小端法
typedef union { int n; char p[sizeof(int)];} union_t;union_t ut;memset(&ut,0, sizeof(ut));ut.p[0] = 13;printf("%d\n", ut.n); 输出结果是什么? 一般来说,大部分用户的操作系统(如windows, FreeB...2011-09-28 23:15:03 · 186 阅读 · 0 评论 -
Memcached内存管理机制
Slab 分配机制 Memcached 不是把所有大小的数据都放在一起的,而是预先分配一系列的 slab,每个slab 负责一定范围内的数据存储。初始时,Memcached 为每一个 slab 分配 一个Page(1M) 的内存, slab内再把page切分成一个一个 Chunk, 组成 Chunk数组,每个Chunk 的大小等于该 slab 的数据存储范围的最大值。...2011-09-29 20:57:31 · 153 阅读 · 0 评论 -
非阻塞connect的实现
步骤1: 设置非阻塞,启动连接实现非阻塞 connect ,首先把 sockfd 设置成非阻塞的。这样调用 connect 可以立刻返回,根据返回值和 errno 处理三种情况:(1) 如果返回 0,表示 connect 成功。(2) 如果返回值小于 0, errno 为 EINPROGRESS, 表示连接 建立已经启动但是尚未完成。这是期望的结果,不是真正的错误。...2011-09-30 01:12:20 · 313 阅读 · 0 评论 -
守护进程的实现
6个步骤 步骤1:创建子进程,杀死父进程,目的是为了步骤2中调用setsid可以成功。 步骤2:创建新会话,并自任组长。目的是脱离控制终端 会话组长调用 setsid 会失败,步骤1创建的子进程必然不是会话组长, 这就保证了 setsid 可以成功。 步骤3:修改工作目录为根目录。 ...2011-09-30 01:43:15 · 118 阅读 · 0 评论 -
Virtualbox下Windows和Linux实现文件互传
1 Windows安装好Linux虚拟机 2 在Linux下运行一个 Python 实现的http服务器,代码如下: #!/usr/bin/env python"""Simple HTTP Server With Upload.This module builds on BaseHTTPServer by implementing the standard G...原创 2012-07-17 21:05:54 · 393 阅读 · 0 评论 -
pthread线程的同步问题
1 互斥变量: pthread_mutex_t,本质上说是一把锁,在访问共享资源前对互斥量加锁,访问完成后释放锁。 对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直至当前线程释放该互斥锁。pthread_mutex_lock : 加锁pthread_mutex_unlock:解锁2 条件变量:pthread_cond_t,多个线程协作的一种同步方式,若某个...2011-04-15 20:01:32 · 233 阅读 · 0 评论 -
多线程与volatile变量
volatile 修饰的变量表示改变量的值是易变的,编译器不对其进行优化,访问该变量的时候不会从寄存器读取, 而是直接从内存读取变量。在多线程环境下,每个线程都有一个独立的寄存器,用于保存当前执行的指令。假设我们定义了一个全局变量,每个线程都会访问这个全局变量,这时候线程的寄存器可能会存储全量变量的当前值用于后续的访问。当某个线程修改了全局变量的值时,系统会立即更新该...原创 2012-02-25 17:07:41 · 357 阅读 · 0 评论 -
Memcached源码分析之内存管理篇
使用命令 set(key, value) 向 memcached 插入一条数据, memcached 内部是如何组织数据呢 一 把数据组装成 itemmemcached 接受到客户端的数据后, 把数据组装成 item, item 的格式如下: 图1 struct item 的结构 源码中这样定义 struct item: /** * Structure ...2012-02-26 15:04:18 · 208 阅读 · 0 评论 -
关于Linux的进程和线程
什么是进程直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源,所以我们也说,进程是资源分配的最小单位。什么是线程线程存在与进程当中,是操作系统调度执行的最小单位。说通俗点,线程就是干活的。进程和线程的区别与联系如果说进程是一个资源管家,负责...原创 2011-04-24 11:19:25 · 164 阅读 · 0 评论 -
(转) Linux 的僵尸(zombie)进程
原文地址: http://coolshell.cn/articles/656.html可能很少有人意识到,在一个进程调用了exit之后,该进程 并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所 有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等...原创 2011-09-17 20:29:39 · 134 阅读 · 0 评论 -
Linux信号详解
一 信号的种类可靠信号与不可靠信号, 实时信号与非实时信号可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于SIGRTMIN的都是非可靠信号.非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信号都是可靠信号, 表...2011-09-17 01:02:23 · 459 阅读 · 0 评论 -
消息队列
一 应用场景有很多业务, 客户端和内网都要进行数据传输和交换, 现有架构中, 客户端不能直接访问内网, 那么客户端只能: 先把数据保存到外网服务器, 然后内网服务器再拉回来处理. 这种方式可以保证数据都能被处理, 但实效性不够. 通常, 外网服务器只起到一个暂时保存数据的作用, 保存客户端报上来的数据, 然后等待内网来拉走,把客户端看做producer, 内网看做co...2011-09-15 22:16:23 · 219 阅读 · 0 评论 -
sockaddr和sockaddr_in的区别
struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。网络中的地址包含3个方面的属性:1 地址类型: ipv4还是ipv62 ip地址3 端口相应的,头文件有如下定义: include <netinet/in.h>struct ...2011-08-14 17:12:02 · 216 阅读 · 0 评论 -
学习使用epoll
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。 一、epoll的优点支持一个进程打开大数目的socket描述符。IO效率不随FD数目增加而线性下降。 二、epoll的使用epoll有2种工作方式:LT和ET。 LT(level triggered,水...2011-08-29 20:39:18 · 130 阅读 · 0 评论 -
epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:* EAGAIN: 再试一次* EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block* perror输出: Resource temporarily unavailable总...2011-08-31 23:40:17 · 353 阅读 · 0 评论 -
Linux进程间通信 之 消息队列(转)
原文地址: http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信...2011-09-01 22:05:31 · 103 阅读 · 0 评论 -
mmap详解
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是...2011-09-02 22:37:32 · 1122 阅读 · 0 评论 -
如何 fork n 个进程(n > 2)
讲到fork, 一个经典的例子如下:if ((pid = fork()) == 0) { printf("in child %d\n", getpid());} else if (pid > 0) { printf("in parent\n");} else { perror("fork"); exit(0);}现在, 我要...2011-09-05 17:03:04 · 113 阅读 · 0 评论 -
Linux进程通信 之 管道
管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 管道是Linux支持的最初Unix IPC形式之一,具有以下特点:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种独立的文件系统:管道对...原创 2011-09-05 21:19:24 · 83 阅读 · 0 评论 -
Linux C线程池实现
三个文件 1 tpool.htypedef struct tpool_work { void (*routine)(void *); void *arg; struct tpool_work *next;} tpool_work_t;typedef struct tpool {...2011-09-08 00:06:39 · 236 阅读 · 0 评论 -
正确使用pthread_cond_wait
消费者的两种等待方式:方式1: if (empty(queue)) { pthread_cond_wait(&queue_has_element, &mutex);}element = dequeue(queue);方式2:while (empty(queue)) { pthread_cond_wait(&queue_h...2011-09-08 00:22:26 · 104 阅读 · 0 评论 -
vim + taglist + ctags + cscope 简单使用
ctags用来跳转, taglist用来列出当前文件的变量, 函数, 宏. cscope用来查找符号一 使用ctags1 在源码目录创建tag文件cd /home/kenby/project/nginx-1.0.0/srcctags -R2 打开一个文件gvim core/ngx_string.c把光标移到变量名或函数名上,然后按下"Ctrl-]"。用"...2011-09-08 21:58:05 · 181 阅读 · 0 评论 -
Memcached源码分析之网络模型篇
memcached 采用多线程的工作方式, 主线程接收连接, 然后把连接平摊给工作线程, 工作线程处理业务逻辑, memcached 使用 libevent 处理网络事件, 主线程和工作线程都有一个 event base, 这是 libevent 的核心数据结构, event base 能够监听多个 socket 的网络事件, 概括起来, memcached 大体框架如 图1 所示...2012-03-02 01:46:48 · 175 阅读 · 0 评论