嵌入式Linux进程和线程编程小述

farmanlinuxer 2011-04-01

现在在Linux中使用较多的进程间通信方式主要有以下几种:管道及有名管道、信号、消息队列、共享内存、信号量、套接字。

进程可以通过3种方式来响应一个信号:

1.忽略信号:即对信号不做任何处理。但是有两个信号不能忽略:SIGKILL及SIGSTOP

2.捕捉信号:定义信号处理函数。当信号发生时,执行相应的处理函数

3.执行默认操作:Linux对每种信号都规定了默认操作。

一个完整的信号生命周期可以分为3各阶段。这3个阶段由4个重要事件来刻画:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数。

信号的处理包括信号的发送、捕获以及信号的处理:

发送信号的函数:kill、raise。

捕获信号的函数:alarm、pause。

设置信号处理的函数:signal。

共享内存的实现分为3个步骤:

1.创建共享内存,这里用到的函数是shmget,也就是在内存中获得一段共享内存区域。

2.映射共享内存,也就是把这段创建共享内存映射到具体的进程空间去,这里使用的函数是shmat。接着就可以使用这段共享内存了,即可以使用不带缓冲的I/O读写命令对其操作。

3.撤销映射的操作,其函数为shmdt.

消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这4种操作。

1.创建或打开消息队列

使用函数msgget,这里创建的消息队列的数量会受到系统消息对列数量的限制。

2.添加到消息对列

使用函数msgsnd,它把消息添加到已打开的消息对列末尾。

3.读取消息对列内容

使用函数msgrcv,它把消息从消息对列中取走,与FIFO不同的是,这里可以指定取走某一类型的消息。

4.控制消息对列

使用函数msgctl,它可以完成多项功能

使用线程主要包括以下几个步骤:

1.创建线程

这个步骤实际上就是确定线程所要执行的函数,这里使用的函数是pthread_create.

2.调用相关线程函数

在线程创建以后,就开始运行相关的线程函数。

3.线程退出

在线程调用函数运行完之后,该线程也就自动结束了。另外一种退出线程的方法就是使用函数pthread_exit,这是线程的主动行为。

4.线程资源回收

由于一个进程中的多个线程是共享数据段的,因此通常在线程退出后,退出线程所占用的资源并不会随着线程的终止而得到释放。正如进程之间可以用wait系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是pthread_join函数。pthread_join可以用于将当前主线程挂起,等待子线程的结束。这个函数是一个线程阻塞的函数,调用它的线程将一直等待被等待的线程结束为止。当该函数返回时、被等待线程的资源就被收回。

mutex线程访问控制

由于线程共享进程的资源和地址空间,因此在对这些资源进行操作时,必须考虑到线程间资源访问的唯一性问题,POSIX中线程同步的方法主要有互斥锁和信号量的方式。

互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁,这3中锁的区别主要在于其它未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待。

互斥锁的操作主要包括以下几个步骤:

1.互斥锁初始化:pthread_mutex_init.

2.互斥锁上锁:pthread_mutex_lock.

3.互斥锁判断上锁:pthread_mutex_trylock.

4.互斥锁接锁:pthread_mutex_unlock.

5.消除互斥锁:pthread_mutex_destory。

信号量线程控制

函数说明:

1.sem_init用于创建一个信号量,并能初始化它的值

2.sem_wait和sem_trywait相当于P操作,它们都能将信号量的值减一,两者的区别在于若信号量小于0时,sem_wait将会阻塞进程,而sem_trywait则会立即返回。

3.sem_pose相当于V操作,它将信号量的值加一同时发出信号唤醒等待的进程。

4.sem_getvalue用于得到信号量的值

5.sem_destory用于删除信号量

守护进程分4个步骤创建:

1.创建子进程,父进程退出

2.在子进程中创建新的会话

3.改变当前目录为根目录

4.重设文件权限掩码

5关闭文件描述符

相关推荐