Linux进程间通信
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何指定信号处理方式?
表 7-16 所需头文件 函数原型 #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) signum:信号代码,可以为除 SIGKILL 及 SIGSTOP 外的任何一个特定有效的信号 Act:指向 struct sigaction struct sigaction { void (*sa_handler)(int signo); sigset_t sa_mask; int sa_flags; void (*sa_restore)(void); } Oldact:指向 struct sigaction 函数返回值 0 表示成功, -1 表示有错误发生 siga ct ion ( ) 函数语法要点
void main() { printf("Waiting for signal SIGINT or SIGQUIT...\n"); signal(SIGINT, my_func); //收到信号SIGINT,转去执行函数my_func for(;;); exit(0); }
例2:子进程等收到信号才结束
if (pid == 0) {/*子进程*/ printf("Child(pid : %d) is waiting for any signal\n", getpid()); raise(SIGSTOP);// 使子进程暂停 exit(0); }
else {/*父进程*/ if ((waitpid(pid, NULL, WNOHANG)) == 0) { if ((ret = kill(pid, SIGKILL)) == 0) //向子进程发结束信号 printf("Parent kill %d\n",pid); } waitpid(pid, NULL, 0); exit(0); }
Linux进程间通信
Hale Waihona Puke 管道 怎么知道有哪些信号 怎么产生信号 收到信号后怎么处理
怎么知道有哪些信号
查看信号:
kill -l
常用信号
表 7-14 信 号 名 常见信号的含义及其默认操作 含 义 默 认 操 作 终止 终止 终止 终止 终止 终止 终止 暂停进程 停止进程 忽略
SIGHUP SIGINT SIGQUIT SIGILL SIGFPE SIGKILL SIGALRM SIGSTOP SIGTSTP SIGCHLD SIGABORT
如何指定信号处理方式?
表 7-15 所需头文件 函数原型 sign a l( ) 函数语法要点 #include <signal.h> void (*signal(int signum, void (*handler)(int)))(int) signum:指定信号代码 函数传入值 handler: SIG_IGN:忽略该信号 SIG_DFL:采用系统默认方式处理信号 自定义的信号处理函数指针 成功:以前的信号处理配置 函数返回值 出错:1
收到信号后:以下之一处理
• 第一,如果指定了一个信号处理函数,收到信号 后,就转去执行这个信号处理函数。 • 第二,每个信号都有一个默认处理方式(用 SIG_DFL表示 • 第三,忽略这个信号(用SIG_IGN表示)。
signal(SIGINT ,fun ); signal(SIGINT ,SIG_DFL );//可以不写的 signal(SIGINT ,SIG_IGN );
该信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控 制进程结束时,通知同一会话内的各个作业与控制终端不再关联 该信号在用户键入 INTR 字符(通常是 Ctrl-C)时发出,终端驱动程序发送此 信号并送到前台进程中的每一个进程 该信号和 SIGINT 类似,但由 QUIT 字符(通常是 Ctrl-\)来控制 该信号在一个进程企图执行一条非法指令时(可执行文件本身出现错误, 或者试图执行数据段、堆栈溢出时)发出 该信号在发生致命的算术运算错误时发出。这里不仅包括浮点运算错误, 还包括溢出及除数为 0 等其他所有的算术错误 该信号用来立即结束程序的运行,并且不能被阻塞、处理或忽略 该信号当一个定时器到时的时候发出 该信号用于暂停一个进程,且不能被阻塞、处理或忽略 该信号用于交互停止进程,用户键入 SUSP 字符时(通常是 Ctrl+Z)发出 这个信号 子进程改变状态时,父进程会收到这个信号 进程异常终止时发出
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> int main() { pid_t pid; int ret; /* 创建一子进程 */ if ((pid = fork()) < 0) { printf("Fork error\n"); exit(1);}
总结
• 当收到信号后,才可以开始某段程序的执行!所 以又称为软中断
Linux进程间通信
管道
怎么知道有哪些信号 怎么产生信号 收到信号后怎么处理
怎么产生信号?
• 敲某个键盘(组合) SIGINT • 某个进程结束 SIGCHLD • 有些函数可以发信号: kill()、raise()、alarm()
Linux进程间通信
管道
怎么知道有哪些信号 怎么产生信号 收到信号后怎么处理
函数传入值
Linux进程间通信
管道
怎么知道有哪些信号 怎么产生信号 收到信号后怎么处理 举例
例1:敲下ctrl+c,就输出:I have get SIGINT
#include <signal.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> /*信号处理函数*/ void my_func(int sign_no) { if (sign_no == SIGINT) printf("I have get SIGINT\n"); }
Linux进程间通信
• 传统进程通信
• 信号通信 • 管道通信 • 消息队列 • 共享主存 • 信号量
• System V IPC进程通信
• Socket网络进程通信
信号
• 信号是一个发送到进程的特殊信息,是一个整数 值。不同的值代表着不同的意义。Linux在signal.h 文件中定义了常量标识来代表这些信号,方便编 程者引用