APUEAndUNPV2
有时需要偏执狂
一定要搞懂,千万不要心存侥幸,否则一些问题会让你痛苦不堪(源码面前,了无秘密)。
拥有一某三分地不容易,贵在坚持。
展开
-
fork
fork由fork创建的新进程被称为子进程(child process)。 fork 函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0, 而父进程的返回值则是新建子进程的进程ID,由此可以区分父子进程。然后子进程和父进程继续执行fork调用之后的指令。子进程是父迸程的副本,子进程获得父进程数据空间、堆和栈的副本。注意,这是子进程所拥有的副本.父进程和子进程并不共享这些存储空间部分。原创 2017-08-19 11:05:36 · 279 阅读 · 0 评论 -
15章 查看进程间通信命令
ipcs可以查看当前系统存在的任意ipc,指令得好好学习。原创 2017-10-24 21:53:33 · 527 阅读 · 0 评论 -
15章 进程间通信之共享内存区(Posix、System V共享内存)
共享内存区介绍 共享内存是可用IPC形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核(不需要执行内核调用传递数据)。然而往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步。传统IPC: 服务器从输入文件读。该文件的数据由内核读入自己的内存空间,然后从内核复制到服务器进程。服务器往一个管道、 FIFO或消息队列以一条消息的形式写入这原创 2017-09-15 15:55:13 · 822 阅读 · 0 评论 -
Linux之高级IO
简述Linux5大IO模型非阻塞IO 非阻塞IO也就是当读取或者写低速设备时候,设备没有准备好的时候,读写函数直接错误返回,表示如果函数继续执行下去,那么将阻塞。记录锁 记录锁是读写锁的一种扩展类型,可用于亲缘关系或无亲缘关系的进程之间共享某个文件的读与写。被锁住的文件通过文件描述符进行访问,执行上锁的操作函数是fcntl,这种类型的锁通常在内核中维护。 ...原创 2017-09-10 11:46:46 · 1274 阅读 · 0 评论 -
15章 进程间通信之同步(互斥锁、条件变量、读写锁、信号量)
同步: 为了允许在线程和进程间共享数据,必须同步。互斥锁和条件变量是同步的基础。如果互斥锁或者条件变量存放在多个进程间共享的某一个内存区,那么通过它可以进行多进程同步。互斥锁和条件变量 互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行设置(加锁)。在访问完成后释放(解锁)互斥量,对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程都会被阻塞直到当前...原创 2017-09-15 15:54:47 · 1370 阅读 · 0 评论 -
Linux之线程介绍
1、为什么要有线程?一个进程可以有多个线程,这个进程本身也叫做线程只不过是主线程。通常主线程分配任务给子线程做。程序设计时候就可以某一时刻不止做一件事情,每一个线程处理各自独立的任务。多个线程自动可以访问相同的存储地址空间和文件描述符。每个线程都包含有表示执行环境所必须的信息,其中包括线程ID、一组寄存器、栈、调度优先级和策略、信号屏蔽字、errno变量及线程私有数据。一个进程所有信息...原创 2018-02-08 11:55:21 · 447 阅读 · 0 评论 -
进程、僵死进程、孤儿进程、守护进程
僵死进程子进程在父进程之前终止了,内核为每个终止子进程保存了一定量的信息,所以父进程需要调用waitpid可以得到这些信息,包括进程ID、终止状态、使用的CPU时间总量,内核可以释放终止进程所使用的内存空间及其打开的文件描述符。一个已经终止,但是其父进程尚未对其进行善后处理(获取信息,释放资源)的进程称为僵死进程。通过ps命令,我们可以看到该进程的状态为Z(表示僵死)。fork很多子进程,除非...原创 2018-03-19 15:59:53 · 339 阅读 · 0 评论 -
Linux进程控制之深入理解fork
进程标识深入理解fork 创建新的进程,调用一次返回两次。父进程返回子进程ID,子进程返回0,之后子进程和父进程继续执行fork之后的指令。子进程获取父进程的数据空间、堆、栈的副本。父子进程不共享这些存储空间,但是代码段(正文段,指令)是父子进程共享的,这点可以参考C程序内存空间布局,这个很重要哦。传统fork vs 写时拷贝fork首先每个进程都是由实体的,有实际的...原创 2018-03-19 20:56:04 · 1278 阅读 · 0 评论 -
Linux经典同步问题3-读者与写者问题
1、问题描述 简而言之就是,对一个共享内存,都可读但只能一个写。2、读者优先解决方案读进程只要看到有其他读进程正在访问文件,就可以继续作读访问;写进程必须等待所有读进程都不访问时才能写文件,即使写进程可能比一些读进程更早提出申请。semaphore mutex = 1;//对readcount保护semaphore db = 1;//对数据库保护int readrCount ...原创 2018-03-20 16:14:33 · 1645 阅读 · 0 评论 -
预防死锁的银行家算法
安全与不安全状态安全状态:如果没有死锁发生,并且即使所有的进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每个进程运行完毕,那么称该状态安全。 这里使用完后,必须理解归还给系统。不安全状态:下图说明了不安全,不安全不一定发生死锁,只是安全一定不会发生死锁。 ...原创 2018-03-20 21:16:44 · 560 阅读 · 0 评论 -
深入剖析select、poll、epoll
1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。 ...原创 2018-04-11 10:11:08 · 571 阅读 · 0 评论 -
Linux5大IO模型
1、概念理解:在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式。 1、同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。就是我调用一个功能,该功能没有结束前,我死等结果。2、异步:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个原创 2018-04-11 09:29:57 · 573 阅读 · 0 评论 -
Linux 进程间通信小总结
进程间通信(IPC)介绍进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。以Linux中的C语言编程为例。一、管道管道,通常指无名管道,是 UNIX 系统IPC最转载 2018-04-14 21:03:49 · 215 阅读 · 0 评论 -
15章先导篇 Posix/System V IPC共性
POSIX(Portable Operation System Interface)可移植操作系统接口(具体实现依据平台 )标准。目的是为了提升应用程序的各种UNIX系统环境之间的可移植性。就是为了让系统函数调用采用相同的原型标准编写。 Signal UNIX Specification是POSIX.1的一个超集,定义了一些附加接口,扩展了POSIX SVR4(UNIX System V Rel原创 2017-09-17 10:00:07 · 349 阅读 · 0 评论 -
15章 进程间通信之消息传递(管道、FIFO、消息队列)
管道 管道一般是半双工(数据只能在一个方向上流动),管道只能在具有公共祖先(亲缘关系)的两个进程之间使用。一个管道由一个进程创建,在进程fork之后,管道就可以在父子进程之间通信了。特点:它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。它可以看成是一种特殊的文件,对于它的读写也可以使用...原创 2017-09-10 11:47:22 · 2375 阅读 · 0 评论 -
关于APUE 图8-8 孤儿进程例子
#include "apue.h"//自定义重要头文件#include <dirent.h>//目录读取函数#include "myerror.h"//定义自定义出错打印函数#include <sys/wait.h>//进程等待处理#include <errno.h>//出错处理#include <signal.h>//信号处理#include <fcntl.h>//文件IO操作头文件原创 2017-08-19 16:38:43 · 299 阅读 · 1 评论 -
函数exec
int main(int argc , char *argv[])//测试调用函数{ const char *env_init[] = {"USER=unkown","PATH=mypath",NULL}; pid_t pid; if( (pid = fork()) < 0 ) err_sys("fork error"); else if(pid =原创 2017-08-20 10:22:06 · 442 阅读 · 0 评论 -
关于APUE 图8-30 nice函数的例子
#include "apue.h"//自定义重要头文件#include <dirent.h>//目录读取函数#include "myerror.h"//定义自定义出错打印函数#include <sys/wait.h>//进程等待处理#include <errno.h>//出错处理#include <signal.h>#include <fcntl.h>//文件IO操作头文件#inclu原创 2017-08-22 16:01:13 · 501 阅读 · 1 评论 -
1章 套接字API概述
。。。。。。。。原创 2017-09-15 20:10:25 · 286 阅读 · 0 评论 -
Linux之线程控制
线程属性通过函数设置创建线程时候的属性。 int makethread(void * (*fn)(void *) , void *arg)//创建带有分离属性的进程 { int err; pthread_t tid;//线程结构体 pthread_attr_t attr;//线程属性结构体 err = pthread_attr_init(&...原创 2017-09-04 21:56:57 · 423 阅读 · 0 评论 -
3章 文件I/O
To Be Continue原创 2017-09-17 22:05:01 · 289 阅读 · 0 评论 -
Linux之进程之间的关系
进程组:一个或多个进程集合,拥有一个组ID(pgid),同一个组中各个进程可以接受来自同一终端的各种信号。会话:一个或多个进程组的集合,拥有一个会话ID(sid),通常通过shell管道将几个进程编成一个组。一个会话可以有一个控制终端,终端登陆情况下称为终端设备,网络登陆下称为伪终端设备。一个会话中的几个进程组,可以分成一个前台进程组和一个或多个后台进程组。从终端键入控制键都将信号发送至...原创 2017-08-26 10:21:14 · 1114 阅读 · 0 评论 -
10章 信号
信号及其宏定义bash配置的组合按键: ctrl+c 产生 SIGINT 中断信号 ctrl+z产生 SIGSTOP信号 ctrl+\产生 SIGQUIT信号 kill -** PID 向某某进程发送信号 ctrl+d产生eof符号,并非信号/* Signals. */#define SIGHUP 1 /* Hangup (POSIX). */#d...原创 2017-08-30 15:27:37 · 656 阅读 · 0 评论 -
Linux之进程控制
不同进程直接不同步或者通信就会产生竞争关系。下面是一个父子进程同时输出,没有进行同步处理static void print(char *str){ char *ptr; char c; setbuf(stdout , NULL); for(ptr = str ;(c = *ptr++) != 0 ;){//这句for循环,先初始化ptr,然后利用c等于...原创 2017-09-03 15:34:54 · 242 阅读 · 0 评论 -
Linux错误代码含义
常用linux错误代码含义,如下表所示:名称值描述EPERM1操作不允许ENOENT2无此文件或目录ESRCH3无此进程EINTR4中断系统调用EIO5I/O 错误ENXIO6无此设备或地址E2BIG...转载 2018-04-11 10:12:30 · 612 阅读 · 0 评论