自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

oguro的博客

留下思索,分享感悟

  • 博客(38)
  • 收藏
  • 关注

原创 linux管道pipe详解

管道管道的概念:管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:1. 其本质是一个伪文件(实为内核缓冲区)2. 由两个文件描述符引用,一个表示读端,一个表示写端。3. 规定数据从管道的写端流入管道,从读端流出。管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。管道的局限性

2016-12-23 17:16:36 92118 11

原创 linux多线程结束时,回收子进程问题

当已经有SIGCHLD信号时,我们调用waitpid是可以立即返回的。所以经常在SIGCHLD处理程序中调用waitpid函数,这样就可以期望他总能立即返回,但是如果在执行SIGCHLD处理程序期间又有子进程终止,因为unix不对信号排队,如果多于一个子进程终止,则会导致信号丢失,在这种情况下,如果只调用一次waitpid就会导致僵死进程的产生,可以采取while(waitpid(-1,0,WNO

2016-12-26 20:25:06 937

原创 linux将参数传递到信号处理函数

普通的信号处理函数,在注册时一般为:singal(信号,信号处理函数),此种都不能把需要的参数传递到处理函数里面。如果想将参数也传递到信号处理函数里面,需要用到sigaction结构体。注册函数为sigaction函数。 发送信号并传递信息用sigqueue函数。#include #include #include void new_op(int,siginfo_

2016-12-26 20:21:21 7611

原创 linux文件锁

文件锁借助 fcntl函数来实现锁机制。操作文件的进程没有获得锁时,可以打开,但无法执行read、write操作。fcntl函数: 获取、设置文件访问控制属性。int fcntl(int fd, int cmd, ... /* arg */ );参2:F_SETLK (struct flock *) 设置文件锁(trylock)F_SETLKW (struct floc

2016-12-25 12:30:13 540

原创 linux进程互斥锁

进程间同步互斥量mutex进程间也可以使用互斥锁,来达到同步的目的。但应在pthread_mutex_init初始化之前,修改其属性为进程间共享。mutex的属性修改函数主要有以下几个。主要应用函数:pthread_mutexattr_t mattr 类型: 用于定义mutex锁的【属性】pthread_mutexattr_init函数: 初始化一个mutex属性对象int

2016-12-25 12:27:30 3050 1

原创 linux信号量

信号量进化版的互斥锁(1 --> N)由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行。与直接使用单进程无异。信号量,是相对折中的一种处理方式,既能保证同步,数据不混乱,又能提高线程并发。

2016-12-25 12:23:21 1013

原创 linux条件变量

条件变量:条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。主要应用函数:pthread_cond_init函数pthread_cond_destroy函数pthread_cond_wait函数pthread_cond_timedwait函数pthread_cond_signal函数pthread_cond_broadca

2016-12-25 12:20:35 537

原创 linux读写锁

读写锁与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。读写锁状态:一把读写锁具备三种状态:1. 读模式下加锁状态 (读锁)2. 写模式下加锁状态 (写锁)3. 不加锁状态读写锁特性: 1. 读写锁是“写模式加锁”时, 解锁前,所有对该锁加锁的线程都会被阻塞。2. 读写锁是“读模式加锁”时, 如果线程以读模式对其加锁会成功;如果线程以写模式加

2016-12-25 12:15:04 771

原创 linux互斥锁

互斥量mutex Linux中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。资源还是共享的,线程间也还是竞争的, 但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。 但,应注意:同一时刻,只能有一个线程持有该锁。当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁

2016-12-25 12:12:55 829

原创 linux线程属性

线程属性本节作为指引性介绍,linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。typedef struct{int etachstate; //线程的分离状态int s

2016-12-25 10:28:16 450

原创 linux线程控制原语2

pthread_exit函数将单个线程退出void pthread_exit(void *retval); 参数:retval表示线程退出状态,通常传NULL思考:使用exit将指定线程退出,可以吗? 【pthrd_exit.c】#include #include #include #include void *tfn(void *arg){ int i; i =

2016-12-25 10:26:09 374

原创 linux线程控制原语1

pthread_self函数获取线程ID。其作用对应进程中 getpid() 函数。pthread_t pthread_self(void); 返回值:成功:0; 失败:无!线程ID:pthread_t类型,本质:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现线程ID是进程内部,识别标志。(两个进程间,线程ID允许相同)注意:不应使用全局变量 pthread_

2016-12-25 10:21:08 527

原创 linux守护进程

守护进程Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。    创建守护进程,最关键的一步是调用se

2016-12-24 15:38:13 370

原创 linux会话

会话创建会话创建一个会话需要注意以下6点注意事项:1. 调用进程不能是进程组组长,该进程变成新会话首进程(session header)2. 该进程成为一个新进程组的组长进程。3. 需有root权限(ubuntu不需要)4. 新会话丢弃原有的控制终端,该会话没有控制终端5. 该调用进程是组长进程,则出错返回6. 建立新会话时,先调用fork, 父进程终止,子进程调用

2016-12-24 15:35:20 2803 2

原创 linux进程组操作函数

进程组操作函数getpgrp函数获取当前进程的进程组IDpid_t getpgrp(void); 总是返回调用者的进程组IDgetpgid函数获取指定进程的进程组IDpid_t getpgid(pid_t pid);  成功:0;失败:-1,设置errno如果pid = 0,那么该函数作用和getpgrp一样。练习:查看进程对应的进程组ID 【getpgid.c】

2016-12-24 15:33:17 757

原创 linux的SIGCHLD信号

SIGCHLD信号SIGCHLD的产生条件子进程终止时子进程接收到SIGSTOP信号停止时子进程处在停止态,接受到SIGCONT后唤醒时借助SIGCHLD信号回收子进程#include #include #include #include #include #include #include void sys_err(char *str){ per

2016-12-24 11:26:32 10766 1

原创 linux的信号捕捉函数详解

信号捕捉signal函数注册一个信号捕捉函数:typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。

2016-12-24 10:37:54 5540 1

原创 linux信号集操作函数

信号集操作函数内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在应用程序中自定义set来改变mask。已达到屏蔽指定信号的目的。信号集设定sigset_t  set; // typedef unsigned long sigset_t;int sigemptyset(sigset_t *set); 将某个信号集清0   成功:0;失

2016-12-24 10:14:26 903

原创 linux共享存储映射mmap

共享存储映射文件进程间通信使用文件也可以完成IPC,理论依据是,fork后,父子进程共享文件描述符。也就共享打开的文件。   练习:编程测试,父子进程共享打开的文件。借助文件进行进程间通信。    【fork_shared_fd.c】/* *父子进程共享打开的文件描述符------使用文件完成进程间通信. */#include #include #include #i

2016-12-23 17:59:24 2463

原创 linux的waitpid函数

waitpid函数作用同wait,但可指定pid进程清理,可以不阻塞。    pid_t waitpid(pid_t pid, int *status, in options);成功:返回清理掉的子进程ID;失败:-1(无子进程)特殊参数和返回情况:参数pid: > 0 回收指定ID的子进程-1 回收任意子进程(相当于wait)0 回收和当前调用waitpid一

2016-12-23 16:53:54 1506

原创 Linux的wait函数

一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊变量$?查看,因为Shell是它的父进程,当它终止时Shell调用wa

2016-12-23 16:50:08 3372

原创 孤儿进程和僵尸进程的概念

孤儿进程孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。     【orphan.c】#include #include #include int main(void){ pid_t pid; pid = fork(); if (pid == 0) { while

2016-12-23 16:40:04 404

原创 gdb调试跟踪多进程

gdb调试使用gdb调试的时候,gdb只能跟踪一个进程。可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或者是跟踪子进程。默认跟踪父进程。set follow-fork-mode child 命令设置gdb在fork之后跟踪子进程。set follow-fork-mode parent 设置跟踪父进程。注意,一定要在fork函数调用之前设置才有效。

2016-12-23 16:29:34 711

原创 Linux进程共享

进程共享父子进程之间在fork后。有哪些相同,那些相异之处呢?刚fork之后:父子相同处: 全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式...父子不同处: 1.进程ID   2.fork返回值   3.父进程ID    4.进程运行时间    5.闹钟(定时器)   6.未决信号集似乎,子进程复制了父进程0-3G用户

2016-12-23 16:27:11 589

原创 使用java的IO字节流拷贝图片

需求: 拷贝一张图片。import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class CopyImage { public static void main(String[] args) th

2016-12-19 10:29:12 3337

原创 java输出字节流 FileOutStream类

输出字节流: --------| OutputStream 是所有输出字节流 的父类。  抽象类 -----------| FileOutStream 向文件输出数据的输出字节流。 FileOutputStream如何使用呢?1. 找到目标文件2. 建立数据的输出通道。3. 把数据转换成字节数组写出。4. 关闭资源FileOutputStream要注意的

2016-12-19 10:18:31 6278

原创 java的输入字节流 FileInputStream类

File类: 用于描述一个文件或者文件夹的。 通过File对象我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要使用IO流技术。 IO流(Input Output)IO流分类:如果是按照数据的流向划分: 输入流 输出流如果按照处理的单位划分:字节流: 字节流读取得都是文件中二进制数据,读取到二进制数据不会经过任何的

2016-12-19 09:14:16 3765

原创 java的File类

IO流(Input Output) :IO技术主要的作用是解决设备与设备之间 的数据传输问题。 比如: 硬盘--->内存          内存的数据---->硬盘上            把键盘的数据------->内存中数据保存到硬盘上,该数据就可以做到永久性的保存。   数据一般是以文件的形式保存到硬盘上sun使用了一个File类描述了文件或者文件夹的。File类

2016-12-16 16:41:16 364

原创 jdk1.5新特性之枚举

jdk1.5新特性之-----枚举  问题:某些方法所接收的数据必须是在固定范围之内的, 解决方案: 这时候我们的解决方案就是自定义一个类,然后是私有化构造函数,在自定义类中创建本类的对象对外使用。jdk1.5对以上问题提出了新的解决方案: 就是使用枚举类解决。一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,Java5以后可以直接使用枚举予以解决。

2016-12-16 16:01:59 339

原创 jdk1.5新特性之自动装箱与自动拆箱

jdk1.5新特性之-----自动装箱与自动拆箱  java是面向对象 的语言,任何事物都可以使用类进行描述,sun就使用了 一些类描述java中八种基本数据类型数据   基本数据类型            包装类型  byte      Byteshort        Shortint           Integerlong          Lon

2016-12-16 15:53:19 410

原创 jdk1.5新特性之可变参数

jdk1.5新特性之------->可变参数需求: 定义一个函数做加法功能(函数做几个数据 的加法功能是不确定)。可变参数的格式:数据类型... 变量名可变参数要 注意的细节: 1. 如果一个函数 的形参使用上了可变参数之后,那么调用该方法的时候可以传递参数也可以不传递参数。2. 可变参数实际上是一个数组对象。3. 可变参数必须位于形参中的最后一个参数。

2016-12-16 15:47:22 300

原创 jdk1.5新特性之增强for循环

jdk1.5出现的新特性---->增强for循环增强for循环的作用: 简化迭代器的书写格式。(注意:增强for循环的底层还是使用了迭代器遍历。)增强for循环的适用范围: 如果是实现了Iterable接口的对象或者是数组对象都可以使用增强for循环。增强for循环的格式:    for(数据类型  变量名  :遍历的目标){    }增强for循环

2016-12-14 17:31:26 388

原创 jdk1.5新特性之静态导入

jdk1.5新特性之-------静态导入 静态导入的作用: 简化书写。静态导入可以作用一个类的所有静态成员。  静态导入的格式:  import static 包名.类名.静态的成员; 静态导入要注意的事项:  1. 如果静态导入的成员与本类的成员存在同名的情况下,那么默认使用本类的静态成员,如果需要指定使用静态导入的成员,那么需要在静态成员前面加上类

2016-12-14 17:27:19 420

原创 java的HashMap类

双列集合:-------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复。----------------| HashMap  底层也是基于哈希表实现 的。HashMap的存储原理:往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该元素在哈

2016-12-03 15:15:50 379

原创 java的TreeMap类

双列集合:-------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复。----------------| HashMap  底层也是基于哈希表实现 的。HashMap的存储原理:往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该元素在哈

2016-12-03 15:07:11 597

原创 java泛型详解

泛型是jdk1.5使用的新特性。  泛型的好处:  1. 将运行时的异常提前至了编译时。  2. 避免了无谓的强制类型转换 。  泛型在集合中的常见应用:    ArrayList  list = new ArrayList();  正确    推荐使用。    ArrayList  list = new ArrayList();  错误  Ar

2016-12-03 15:04:40 332

原创 eclipse快捷键

ctrl + shift + /  添加多行注释ctrl  + shift + \  取消多行注释.ctrl + 1      修复错误alt + / 内容补全alt + 上下方向  代码块移动 ctrl + / 添加或取消注释 ctrl + shift 代码格式化 ctrl+ shift + o   导包ctrl +D 删除当前行

2016-12-03 15:00:34 263

原创 C++子类构造和析构被时,父类构造和析构的调用顺序

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。构造原则如下:    

2016-12-03 14:56:39 2717 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除