Chinaunix首页 | 论坛 | 博客
  • 博客访问: 392797
  • 博文数量: 80
  • 博客积分: 1982
  • 博客等级: 上尉
  • 技术积分: 1737
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-26 22:41
文章存档

2013年(9)

2012年(71)

分类: LINUX

2012-10-08 13:59:01

    IPC:Inter-Process Communication,进程间通信
    信号:信号是UNIX所使用的进程通信中最古老的一种方法。它是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接在用户空间进程和内核空间进程之间进行交互。信号可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行,内核再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延时,直到其阻塞被取消时才被传递给进程。

命令kill -l 可以列出该系统所支持的所有信号的列表:
#kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
不可靠信号(非实时信号):信号值在32之前,从UNIX系统继承下来的信号。
可靠信号(实时信号):用"SIGRTMIN"或"SIGRTMAX"开头的信号。

    如何区分可靠信号和不可靠信号?
    一个完整的信号流程:信号的产生(内核进程)——>信号的注册(用户进程)——>信号的注销(用户进程)——>信号处理
    不可靠信号的处理过程是这样的:如果发现该信号已经在进程中注册,那么久忽略该信号。因此,若前一个信号还未注销又产生了相同的信号就会导致信号丢失。而当可靠信号发送给一个进程时,不管该信号是否已经在进程中注册,都会被在注册一次,因此信号就不会丢失,所有可靠信号都支持排队。
注意:信号的产生、注册和注销是指信号的内部实现机制,而不是调用信号的函数实现。(与kill()和signal()无关,只与信号值有关)

信号发送与捕捉:
int kill(pid_t pid, int sig);可以发送信号给进程或进程组。
int raise(int sig);与kil()函数不同,raise()函数允许进程向自身发送信号。
unsigned int alarm(unsigned int seconds);设置定时器,当定时时间到时向进程发送SIGALARM信号。
int pause(void);将进程挂起直至捕捉到信号为止。
信号处理函数:
signal()函数勇于处理前32种非实时信号的处理,不支持信号传递信息,使用简便、易于理解。Linux还支持一个更健壮的信号处理函数sigaction()。

signal()函数:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
函数原型理解:signal函数有两个参数 int signum 和 一个指向函数的指针 handler,这个函数有一个 int 参数,返回 void。而 signal 返回值是指向函数的指针,这个函数有一个int 参数,返回 void。
 signal_test.zip  

sigaction()函数:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction {
                  void (*sa_handler)(int);
                  void (*sa_sigaction)(int, siginfo_t *, void *);
                  sigset_t sa_mask;
                  int sa_flags;
                  void (*sa_restorer)(void);
}
sa_mask gives a mask of signals which should be blocked  during  execu-tion  of  the  signal handler.  In addition, the signal which triggered the handler will be blocked, unless the SA_NODEFER flag is used.

信号集函数组:
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);
设置信号屏蔽位:
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);


                       ——忠于梦想 勇于实践    linux_xpj@opencores.org
阅读(936) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~