unix 环境编程
文章平均质量分 61
acp小鸡炖蘑菇
我是程序猿吗?
展开
-
linux 内核与用户空间通信之netlink使用方法
Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Na转载 2016-07-06 10:57:56 · 744 阅读 · 0 评论 -
进程的三种基本状态
进程的基本状态: 1、就绪(Ready)状态 当进程已分配到除CPU以外的所有必要资源后,只要在获得CPU,便可立即执行,进程这时的状态就称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,称为就绪队列。 2、执行状态 进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;再多处理机原创 2015-12-21 13:41:59 · 5012 阅读 · 0 评论 -
Linux多线程实践(5) --Posix信号量与互斥量(解决生产者消费者问题)
Posix信号量Posix 信号量有名信号量无名信号量sem_opensem_initsem_closesem_destroysem_unlink sem_waitse转载 2016-01-03 16:02:43 · 487 阅读 · 0 评论 -
Linux多线程实践(6) --Posix读写锁(解决读者写者问题)
Posix读写锁[cpp] view plaincopyint pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwl转载 2016-01-03 16:04:13 · 719 阅读 · 0 评论 -
Linux多线程实践(7) --Posix条件变量
Posix条件变量[cpp] view plaincopyint pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_c转载 2016-01-03 16:05:18 · 402 阅读 · 0 评论 -
Linux多线程实践(4) --线程特定数据
线程特定数据[cpp] view plaincopyint pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_delete(pthread_key_t key); int pthread_setspeci转载 2016-01-03 16:01:44 · 344 阅读 · 0 评论 -
Linux多线程实践(3) --线程属性
初始化/销毁线程属性[cpp] view plaincopyint pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr); 线程分离属性[cpp] view plaincop转载 2016-01-03 16:00:31 · 315 阅读 · 0 评论 -
Linux多线程实践(2) --线程基本API
POSIX线程库 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”开头,要使用这些函数库,要通过引入头文,而且链接这些线程函数库时要使用编译器命令的“-lpthread”选项[Ubuntu系列系统需要添加的是”-pthread”选项而不是”-lpthread”,如Ubuntu 14.04版本,深度Ubuntu等] 1.pthread_cr转载 2016-01-03 15:59:27 · 294 阅读 · 0 评论 -
Linux多线程实践(1) --线程理论
线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列/指令序列”; 一切进程至少有一个执行线程;进程 VS. 线程 1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分(非常少O(转载 2016-01-03 15:57:45 · 403 阅读 · 0 评论 -
Linux IPC实践(13) --System V IPC综合实践
实践:实现一个先进先出的共享内存shmfifo 使用消息队列即可实现消息的先进先出(FIFO), 但是使用共享内存实现消息的先进先出则更加快速; 我们首先完成C语言版本的shmfifo(基于过程调用), 然后在此基础上实现C++版本的ShmFifo, 将1块共享内存与3个信号量(1个mutext信号量, 1个full信号量, 1个empty信号量)封装成一个类Sh转载 2016-01-03 10:25:00 · 428 阅读 · 0 评论 -
Linux IPC实践(12) --System V信号量(2)
实践1:信号量实现进程互斥父子进程执行流程如下:父进程子进程PPO(print)X(print)sleepsleepO(print)X(print)VV转载 2016-01-03 10:23:27 · 332 阅读 · 0 评论 -
同一进程中线程共享和独占的资源
统一进程中的线程共享的资源包括:1. 进程代码段2. 进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)3. 进程打开的文件描述符4. 信号的处理器5. 进程的当前目录6. 进程用户ID与进程组ID。 进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些独占的资源包括:原创 2015-12-04 17:57:31 · 3559 阅读 · 0 评论 -
Linux进程实践(3) --进程终止与exec函数族
进程的几种终止方式(1)正常退出 从main函数返回[return] 调用exit 调用_exit/_Exit(2)异常退出 调用abort 产生SIGABOUT信号 由信号终止 Ctrl+C [SIGINT] ...(并不完全, 如return/pthread_exit等)测试[ex转载 2015-12-25 17:44:02 · 355 阅读 · 0 评论 -
Linux信号实践(2) --信号分类
信号分类 不可靠信号Linux信号机制基本上是从UNIX系统中继承过来的。早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。转载 2015-12-25 17:50:28 · 231 阅读 · 0 评论 -
Linux信号实践(1) --Linux信号编程概述
中断 中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序; 计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽屏蔽以及保护现场 -> CPU(查询中断向量表, 找到中断服务程序的入口地址)执行中断处理程序 ->(处理完中断之后) ->恢复现场,继续执行原来的任务 中断分类硬件中断(外部中转载 2015-12-25 17:48:34 · 267 阅读 · 0 评论 -
Linux进程实践(5) --守护进程
概述 守护进程是在需要在后台长期运行不受终端控制的进程,通常情况下守护进程在系统启动时自动运行,在服务器关闭的时候自动关闭;守护进程的名称通常以d结尾,比如sshd、xinetd、crond、atd等。守护进程编程规则 调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0) 调用fork(),创建新进程,它会是将来的守护进程转载 2015-12-25 17:47:42 · 280 阅读 · 0 评论 -
Linux进程实践(4) --wait避免僵尸进程
Wait的背景 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。 父进程查询子进程的退出状态可以用wait/waitpid函数[cpp]转载 2015-12-25 17:46:43 · 293 阅读 · 0 评论 -
Linux进程实践(2) --僵尸进程与文件共享
孤儿进程与僵尸进程孤儿进程: 如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)[cpp] view plaincopy//生成孤儿进程 int main(int argc, char *argv[]) { pid_t pid = fork()转载 2015-12-25 17:42:42 · 418 阅读 · 0 评论 -
Linux IPC实践(11) --System V信号量(1)
信号量API[cpp] view plaincopy#include #include #include int semget(key_t key, int nsems, int semflg); int semctl(int semid, int semnum, int cmd, ...); int semop(转载 2016-01-03 10:22:05 · 342 阅读 · 0 评论 -
Linux IPC实践(10) --Posix共享内存
1. 创建/获取一个共享内存[cpp] view plaincopy#include #include /* For mode constants */ #include /* For O_* constants */ int shm_open(const char *name, in转载 2016-01-03 10:21:03 · 241 阅读 · 0 评论 -
Linux IPC实践(9) --System V共享内存
共享内存API[cpp] view plaincopy#include #include int shmget(key_t key, size_t size, int shmflg); void *shmat(int shmid, const void *shmaddr, int shmflg); int shmd转载 2016-01-03 10:19:53 · 286 阅读 · 0 评论 -
文件I/O实践(2) --文件stat
功能:获取文件元数据[cpp] view plaincopy#include #include #include int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(cons转载 2015-12-25 17:38:07 · 395 阅读 · 0 评论 -
文件I/O实践(1) --基础API
什么是I/O输入/输出是内存和外设之间拷贝数据的过程: 设备->内存: 输入操作 内存->设备: 输出操作 高级I/O: ANSI C提供的标准I/O库函数成为高级I/O, 也称为带缓冲的I/O; 低级I/O: Linux 提供的系统调用, 通常也称为不带缓冲的I/O; 文件描述符 对于Linux内核而言, 所有的文转载 2015-12-25 17:36:01 · 415 阅读 · 0 评论 -
Linux进程实践(1) --Linux进程编程概述
进程 VS. 程序什么是程序? 程序是完成特定任务的一系列指令集合。什么是进程? [1]从用户的角度来看:进程是程序的一次执行过程 [2]从操作系统的核心来看:进程是操作系统分配的内存、CPU时间片等资源的基本单位。 [3]进程是资源分配的最小单位 [4]每一个进程都有自己独立的地址空间与执行状态。 [5]像UNIX这转载 2015-12-25 17:41:20 · 272 阅读 · 0 评论 -
文件I/O实践(3) --文件共享与fcntl
文件共享一个进程打开了两个文件文件表条目(file-table-entry): 1.文件状态标志(file-status-flags): 读/写/追加/同步/非阻塞等; 2.当前文件偏移量 3.v节点指针[cpp] view plaincopy//验证 int转载 2015-12-25 17:40:17 · 358 阅读 · 0 评论 -
Linux下C线程池的实现
1.线程池基本原理 在传统服务器结构中, 常是 有一个总的 监听线程监听有没有新的用户连接服务器, 每当有一个新的 用户进入, 服务器就开启一个新的线程用户处理这 个用户的数据包。这个线程只服务于这个用户 , 当 用户与服务器端关闭连接以后, 服务器端销毁这个线程。然而频繁地开辟与销毁线程极大地占用了系统的资源。而且在大量用户的情况下, 系统为了开辟和销毁线程将浪费大量的时间和资源。线程转载 2015-11-24 13:18:31 · 450 阅读 · 0 评论 -
Tcpdump 和 Wireshark 的结合使用(二)
在上一篇博文中我们分别介绍了Tcpdump 和 Wireshark 的简单使用,这一节我们将介绍使用Wireshark 来分析 Tcpdump 抓住的网络包,主要分析TCP三次握手的过程。1.首先我们在Linux系统运行 下面的命令抓包,并保存在 a.cap 文件中, #tcpdump -i lo -w a.cap 然后运行一个简单的原创 2015-11-18 14:32:19 · 1061 阅读 · 1 评论 -
HTTP 请求和应答详解
http协议的请求和应答包详解原创 2015-11-17 18:40:07 · 5803 阅读 · 3 评论 -
Tcpdump 和 Wireshark 的结合使用(一)
1.Tcpdump 和Wireshark的简介(1)Tcpdump 我们用尽量简单的话来定义tcpdump,就是:dump the traffice on anetwork.,根据使用者的定义对网络上的数据包进行截获的包分析工具。作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的东西之一。原创 2015-11-18 13:03:07 · 2866 阅读 · 1 评论 -
Linux环境编程导引
计算机系统硬件组成 总线贯穿整个系统的一组电子管道称为总线, 分为: 片内总线 系统总线数据总线DB地址总线AB控制总线CB 外部总线 I/O设备I/O设备是系统与外界联系的通道 键盘鼠标是输入设备,显式器是输出设备,磁盘既是输入设备也是输出设备,输入输出是相对于内存来说的。转载 2015-12-31 10:09:20 · 250 阅读 · 0 评论 -
Linux信号实践(3) --信号内核表示
信号在内核中的表示 执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。 注意,阻塞和忽略是不同,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样转载 2016-01-02 12:44:29 · 203 阅读 · 0 评论 -
Linux IPC实践(8) --共享内存/内存映射
概述 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图)。 共享内存 VS. 其他IPC形式 用管道/消息队列传递数据 用共享内存传递数据 共享内存生成之后,传递数据并不需要再走Lin转载 2016-01-03 10:16:55 · 268 阅读 · 0 评论 -
Linux IPC实践(7) --Posix消息队列
1. 创建/获取一个消息队列[cpp] view plaincopy#include /* For O_* constants */ #include /* For mode constants */ #include mqd_t mq_open(const char *name, i转载 2016-01-03 10:15:52 · 258 阅读 · 0 评论 -
Linux IPC实践(6) --System V消息队列(3)
消息队列综合案例消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息server进程发送时, 将mtype指定为接收到的client进程的pid client进程发送的时候, mtype指定为自己进程的pidclient进程接收时, 需要将msgtyp指定为自己进程的pid, 只接收消息类型为自己pi转载 2016-01-03 10:14:49 · 350 阅读 · 0 评论 -
Linux IPC实践(5) --System V消息队列(2)
消息发送/接收APImsgsnd函数[cpp] view plaincopyint msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由msgget函数返回的消息队列标识码, 也可以是通过ipcs命令查询出转载 2016-01-03 10:13:31 · 289 阅读 · 0 评论 -
Linux IPC实践(4) --System V消息队列(1)
消息队列概述 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限于本机); 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值. 消息队列也有管道一样的不足: (1)每个消息的最长字节数的上限(MSGMAX); (2)系统中消息队列的总条数也有一个上限(MSGMNI); (3)每个消息队列所能够保存的总字节数是有上限的(M转载 2016-01-03 10:11:27 · 366 阅读 · 0 评论 -
Linux IPC实践(3) --具名FIFO
FIFO具名/命名管道 (匿名)管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道;命名管道是一种特殊类型的文件. 创建一个命名管道1)命名管道可以从命令行上创建: $ mkfifo 2)命名管道在程序里创建:转载 2016-01-03 10:09:43 · 255 阅读 · 0 评论 -
Linux IPC实践(2) --匿名PIPE
管道概念 管道是Unix中最古老的进程间通信的形式,我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”, 管道的本质是固定大小的内核缓冲区; 如:ps aux | grep httpd | awk '{print $2}' 管道限制 1)管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2)匿名管道只能用转载 2016-01-02 12:50:26 · 304 阅读 · 0 评论 -
Linux IPC实践(1) -- 概述
进程的同步与互斥 进程同步: 多个进程需要相互配合共同完成一项任务。 进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源, 而在进程中涉及到互斥资源的程序段叫临界区. Linux IPC发展 Linux下的进程通转载 2016-01-02 12:48:37 · 244 阅读 · 0 评论 -
Linux信号实践(5) --时间与定时器
三种不同精度的睡眠1.sleep[cpp] view plaincopy#include unsigned int sleep(unsigned int seconds); RETURN VALUE Zero if the requested time has elapsed, or the numb转载 2016-01-02 12:47:51 · 346 阅读 · 0 评论