Chinaunix首页 | 论坛 | 博客
  • 博客访问: 866106
  • 博文数量: 190
  • 博客积分: 7021
  • 博客等级: 少将
  • 技术积分: 1752
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 19:26
文章分类

全部博文(190)

文章存档

2014年(9)

2011年(32)

2010年(149)

我的朋友

分类: LINUX

2010-09-15 21:02:13

gcc编译器语法:

 

-c 只进行编译,而不进行链接

-S 输出汇编代码文件

-o 链接生成可执行文件

-g 产生符号调试工具所必要的符号信息

-O 在编译链接过程中进行优化

-I dirname dirname所指的目录加入到头文件搜索目录列表

-L dirname dirname所致的目录加入到函数库搜索目录列表

-lname 在链接过程中加载名字为"libname.a"的函数库。该函数库位于系统预设的目录或者由-L选项确定的目录中

ps -lc表示链接名为"libc.a"的函数库

 

gcc编译器生成动态链接库

    Linux系统下,函数库分为两种不同的类型,分为静态链接库和动态链接库。静态函数库是指当应用程序的目标代码与函数库进行连接时,函数库中被引用的代码将被复制到最终生成的可执行文件。与静态函数库链接后生成的可执行文件,是可以脱离函数库直接运行的。动态链接库则不然,他在内存中包含一份可执行的映像。所有连接到动态链接库的应用程序都共享这一映像。

1 编译。

gcc -fPIC -c xxx.c

-fPIC选项的含义是通过gcc编译器产生可以重定位的目标代码。对于需要被动态链接的函数库,这点尤其重要

2 链接

gcc -shared -o libxxx.so xxx.o

经过编译链接,即可以生成动态链接库,其扩展名为.so。执行file命令可以查看文件的类型。

 

swap分区即交换分区,他的作用是在系统的物理内存紧张的时候,将物理内存的部分数据交换出来,以供当前正在运行的程序使用,Linux系统按照一定的调度算法决定哪些内存空间被交换出来。这部分被交换出来的空间的数据被临时保存到swap分区中,等到这部分数据要使用时,再从swap中恢复保存的数据到内存中

 

信号的阻塞处理:

    信号在几种情况下会进入阻塞状态。

》一是在信号的处理函数执行过程中,该信号将被阻塞,知道信号函数执行完成,该阻塞将会解除。这种机制的作用主要是为了避免信号的嵌套;

》二是当通过sigaction进行信号安装的时候,如果设置了sa_mask阻塞信号集,则该信号集中的信号在信号处理函数被执行的过程期间将会阻塞

》三是通过系统调用sigprocmask,可以通过该系统调用制定阻塞某个或者某几个信号

 

SIGALRM信号:

    在进行阻塞式系统调用时,为避免进行陷入无限期的等待,可以为这些阻塞式系统调用设置定时器。本届将要介绍alarm调用及SIGALRM信号的处理。

 

安装SIGALRM信号:

    要使用定时器,首先要安装该信号。安装SIGALRM信号的过程与其他信号的安装安全相同。可以通过signal或者是sigaction安装;

 

设备定时器:

    SIGALRM信号安装成功后,在Linux系统下,每个进程都有一个唯一的定时器,该定时器提供了以秒为单位的定时器功能。在定时器设置的超时间到达后,调用alarm的进程将收到SIGALRM信号。

 

SIGCLD信号

    Linux的多进程编程中,SIGCLD是一个非常重要的信号。在子进程退出时,将向其父进程发送该信号。

 

子进程的退出过程:

    当一个子进程退出时,并不是立即释放其占用的资源,而是通知其父进程,由父进程进行后续的工作

1)向父进程发送SIGCLD信号,子进程进入zombie(僵尸)状态

2)父进程接受到SIGCLD信号,进行处理

SIGCLD信号的处理:

    

基本的处理方法有两种:

1 父进程忽略SIGCLD信号

2 父进程捕获SIGCLD信号,在SIGCLD信号处理函数中获取子进程的退出状态。

 

信号与信号量的区别:

 

1.信号:(signal)是一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。linux除了支持unix早期的信号语义函数,还支持语义符合posix.1标准的信号函数sigaction

 

2.信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

 

Linux进程间通讯机制主要包括管道,信号,消息队列,共享内存,信号量,套接口

 

管道的分类:

    管道可以分为普通和命名管道两种:

》普通管道位于内存,只能用于有亲缘关系的进程间通讯

》命名管道位于文件系统中,可以实现不同进程间的通讯

 

System V进程间通讯概述

   System V进程间通讯主要包括消息队列,共享内存,信号量,简称IPC。这三种方式的用途各不相同,实现机制则大同小异。IPC对象可以通过编程接口进行访问控制,同时也可以从shell环境中通过命令直接访问

 

shell环境控制IPC

   IPC对象一经创建,系统内核即为该对象分配相关数据结构,为方便对IPC对象的管理,Linux提供专门的IPC控制命令:

ipcs:查看IPC对象信息

ipcrm:删除IPC对象

 

消息队列:

队列:

    在数据结构中,队列定义为一种运算受限的线性表。他只允许在队列的一端进行插入,而在队列的一端进行删除。

消息:

    消息就是进程间传递的数据的内容。在消息队列机制中,消息是有类型的。也就是说,一条消息包含的内容不仅是数据,而且包含消息的类型信息。对于同一个消息队列来说,可以存储各种不同类型的消息,而进程可以根据需要从消息队列中取出自己所需要的类型的消息

ftok | 生成消息队列的键值

功能:生成消息队列的键值

原型

引用

#include
#include

  key_t ftok(const char *pathname, int proj_id);



函数根据参数 pathname proj_id 生成惟一键值。

注意,参数 pathname 在系统中一定要存在且进程对其拥有访问权,参数 proj_id 的取值范围为 1~255

测试代码

引用

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>

int main ()
{
    int i;
    for (i = 1; i <= 5; i++) {
        printf ("key[%d] = %ul \n", ftok(".", i));
    }
    
    return 0;
}

 

对于消息队列更详细的说明:

 

共享内存

    共享内存是IPC机制提供的另一个进程间通讯机制。消息队列在实现消息的收发时,首先由发送进程从进程空间将数据复制至内核分配的数据缓冲区,接受进程再从内核的缓冲区复制到进程的虚拟地址空间,与消息队列的机制不同, 共享内存是通过将内核分配的共享存储区映射到进程的地址空间实现的,没有数据的复制过程,因此,共享内存的访问速度比消息队列要快。

共享内存基本概念:

    共享内存是Linux系统内核分配的一块存储区。两个进程通过共享内存通讯是指,同一块物理内存被映射到多个进程各自的进程地址空间。各个进程都可以对共享内存中数据进行更新。使用共享内存可以更快地实现进程间通讯。

http://hylcarson.blog.sohu.com/54735006.html

 

更详细的请参看:

http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html(上)

http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html(下)

 

信号量

    在多进程编程环境下,进程间往往需要共享某些资源。在多个进程同时对这些共享资源进行操作时,可能会出现访问冲突,为了更好的控制对共享资源的访问,Linux系统提供了一种称作信号量的机制

关于PV操作

在计算机操作系统中,PV操作是进程管理中的难点。

首先应弄清PV操作的含义PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:

    PS):将信号量S的值减1,即S=S-1

           如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

    VS):将信号量S的值加1,即S=S+1

           如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

PV操作的意义我们用信号量及PV操作来实现进程的同步和互斥PV操作属于进程的低级通信。

什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。

    一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S=<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

    利用信号量和PV操作实现进程互斥的一般模型是:

进程P1              进程P2           ……          进程Pn

……                  ……                           ……

PS);              PS);                         PS);

临界区;             临界区;                        临界区;

VS);              VS);                        VS);

……                  ……            ……           ……

    其中信号量S用于互斥,初值为1

    使用PV操作实现进程互斥时应该注意的是:

    1)每个程序中用户实现互斥的PV操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。

    2PV操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。

3)互斥信号量的初值一般为1

    利用信号量和PV操作实现进程同步

PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。

    使用PV操作实现进程同步时应该注意的是:

   1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。

    2)信号量的初值与相应资源的数量有关,也与PV操作在程序代码中出现的位置有关。

    3)同一信号量的PV操作要成对出现,但它们分别在不同的进程代码中。

阅读(1428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~