(具体的实验代码,在这里)
1. 基础理论
1.1 信号(signal):进程最古老的通信方式
———————————————————
| 进程A/内核 | 进程B |
| 1.选择信号 | |
| 2.发送信号 | |
| | 3.接收信号 |
| | 4.处理信号 |
———————————————————
1.2 信号的类型
Linux支持的信号都定义在 /usr/include/asm/singal.h 中,常用到的信号:
SIGKILL 杀死进程
SIGSTOP 暂停进程
SIGCHID 子进程停止或结束时,通知父进程
2. 函数学习——信号的发送和处理
2.1 发送信号
函数名:
kill
函数原型:
int kill( pid_t pid, int sig );
函数功能:
向一个进程发送信号
所属头文件:
<sys/types.h> <signal.h>
返回值:
成功:返回0 失败:返回-1
参数说明:
pid:如果pid > 0,pid指明接受信号的进程号
2.2 处理信号
函数名:
signal
函数原型:
typedef void ( *sig handler_t)(int)sighandler_t signal(int signum, sighandler_t handler);
函数功能:
设置信号的处理方式
所属头文件:
<signal.h>
返回值:
成功:返回处理函数的指针 失败:返回SIG_ERR
参数说明:
signum:要处理的信号
handler:对应信号的处理方式(三种取值)
SIG_IGN:忽略这个信号,不处理
SIG_DEF:交给内核处理
用户自定义的函数:交给用户自动以的函数处理
3. 综合实力——A、B进程利用信号通信
3.1 touch a_process.c
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
int main(int argc, char ** argv)
{
pid_t pid = ati(argv[1]);
kill(pid, SIGINT);
return 0;
}
3.2 touch b_process.c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void myfun(void)
{
printf("here is b_process,received SIGINT\n");
}
int main(int argc, char ** argv)
{
signal(SIGINT, myfun());
pause();
return 0;
}
/*********************************************************************************
上面这两个程序是,先启动bprocess,然后在另一个中断查看bprocess的进程号
然后以bprocess的进程号为参数,启动aprocess,于是,aprocess捕获
bprocess的进程号后,给bprocess发送一个信号,使bprocess打印一条语句。
**********************************************************************************
atoi()
int atoi(const char *nptr)
讲一个字符串转换为整形,成功返回int,失败返回0,头文件是<stdlib.h>
**********************************************************************************
pause()
int pause(void);
暂停当前进程,直到被信号所中断,只返回-1,头文件是<unistd.h>
*********************************************************************************/