摘要: 序linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来,如图示:其中,最初Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、Syst 阅读全文
posted @ 2013-04-11 15:06 ~风~ 阅读(631) 评论(0) 推荐(0) 编辑
摘要: unistd.h 是 C 和 C++ 程序设计语言中提供对 POSIX 操作系统 API 的访问功能的头文件的名称。该头文件由 POSIX.1 标准(单一UNIX规范的基础)提出,故所有遵循该标准的操作系统和编译器均应提供该头文件(如 Unix 的所有官方版本,包括 Mac OS X、Linux 等)。对于类 Unix 系统,unistd.h 中所定义的接口通常都是大量针对系统调用的封装(英语:wrapper functions),如 fork、pipe 以及各种 I/O 原语(read、write、close 等等)。类似于 Cygwin 和 MinGW 的 Unix 兼容层也提供相应版本. 阅读全文
posted @ 2013-04-11 10:59 ~风~ 阅读(2753) 评论(0) 推荐(0) 编辑
摘要: 1. Linux系统调用原理2. 系统调用的实现3. Linux系统调用分类及列表4.系统调用、用户编程接口(API)、系统命令和内核函数的关系5. Linux系统调用实例6. Linux自定义系统调用1.系统调用原理系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把 阅读全文
posted @ 2013-04-11 10:44 ~风~ 阅读(1416) 评论(0) 推荐(1) 编辑
摘要: 当我们看恐怖片时,经常会有这样的场景:当一个人被鬼上身后,这个人的身体表面上还和以前一样,但是他的灵魂和思想已经被这个鬼占有了,因此它会控制这个人做他自己想做的事情--那么在进程中也有这样的情景。那么是如何实现的呢?现在我们来学习exec()函数族一.exec()函数 族 1. 首先我们在终端输入命令:man exec 可以看到函数的原型:#include <unistd.h>int execl(const char *path, const char *arg, ...);int execv(const char *path, char *const argv[]);int ex 阅读全文
posted @ 2013-04-11 09:27 ~风~ 阅读(754) 评论(0) 推荐(0) 编辑
摘要: 随着一句fork,一个新进程呱呱落地,但它这时只是老进程的一个克隆。然后随着exec,新进程脱胎换骨,离家独立,开始了为人民服务的职业生涯。人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数的最后一个”}”,从容地离我们而去;也可以是自杀,自杀有2种方式,一种 是调用 exit函数,一种是在main函数内使用return,无论哪一种方式,它都可以留下遗书,放在返回值里保留下来;它还甚至能可被谋杀,被其它进程通过 另外一些方式结束他的生命。进程死掉以后,会留下一具僵尸,wait和waitpid充当了殓尸工,把僵尸推去火化,使其最终归于无形。系统中的僵尸进程都要由wait系统调用来. 阅读全文
posted @ 2013-04-10 18:38 ~风~ 阅读(527) 评论(0) 推荐(0) 编辑
摘要: 前面已经谈了内核加载与系统引导过程,下面我们来看看内核的 do_fork() 函数是如何创建一个新的进程的。在 Linux 内核中,供用户创建进程的系统调用fork()函数的响应函数是 sys_fork()、sys_clone()、sys_vfork()。这三个函数都是通过调用内核函数 do_fork() 来实现的。根据调用时所使用的 clone_flags 参数不同,do_fork() 函数完成的工作也各异。这部分内容简单,我不打算就此而展开分析。下面我们重点来讲解以下 do_fork() 函数的工作原理。我们知道 do_fork() 函数生成一个新的进程,大致分为三个步骤。1、建立进程控. 阅读全文
posted @ 2013-04-10 17:51 ~风~ 阅读(588) 评论(0) 推荐(0) 编辑
摘要: 一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 我们来看一个例子:[cpp] view plaincopyprint?/* * fork_test.c * version 1 * Created on: 2010-5-29 *... 阅读全文
posted @ 2013-04-10 16:43 ~风~ 阅读(286) 评论(0) 推荐(0) 编辑
摘要: 一、引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与DOS和早期的Windows不同,Unix/Linux系统是真正实现多任务操作的系统,可以说,不使用多进程编程,就不能算是真正的Linux环境下编程。 多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix系统中才引入多线程机制,如今,由.. 阅读全文
posted @ 2013-04-10 12:39 ~风~ 阅读(224) 评论(0) 推荐(0) 编辑
摘要: C语言真是很灵活,今天发现结构中函数指针的应用,就查了些资料总结一下。其实在结构体已经和C++中的类功能差不多,只是其是面向过程,没有了作用域的要求,如public等你可以在结构体中定义函数函数指针,然后对其调用和类调用方法一样,在调用时对其赋值(你要调用的指针),这样看来,C也可以临时客串一下面向对象了。呵呵.大家可以试一下. 1 #include<stdio.h> 2 struct square 3 { 4 int length; 5 int width; 6 int height; 7 int (*add)(int a,int b); 8 }; 9 int square_ad 阅读全文
posted @ 2013-04-10 12:17 ~风~ 阅读(579) 评论(0) 推荐(0) 编辑
摘要: 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传递给read或write。 按照惯例,UNIX系统shell使用文件描述符0与进程的标准输入相关联,文件描述符1与标准输出相关联,文件描述符2与标准出错相关联。这是各种shell以及很多应用程序使用的惯例,而与UNIX内核无关,如果不遵守这种惯例,那么很多UNIX系统应用程序就不能正常工作。 在依从POSIX的应用程序中,幻数0、1、2应当替换成符号常量 阅读全文
posted @ 2013-04-10 10:26 ~风~ 阅读(844) 评论(0) 推荐(0) 编辑