2.进程间的信号传递

来源:互联网 发布:在淘宝上买东西的流程 编辑:程序博客网 时间:2024/05/20 22:37
8.23
问题1:linux如何移动一个文件夹到另外一个目录下
mv 目录  新目录
问题2:vi编辑器如果保存并退出:wq.(注意冒号)

https://wenku.baidu.com/view/32cdfa48cc22bcd126ff0ceb.html
的第3题,学习c的信号传递,首先看看信号是什么鬼:
http://www.runoob.com/cplusplus/cpp-signal-handling.html
根据这2份源代码,初见端虞:
发送信号的进程源代码contrl:
#include<stdio.h>#include<stdlib.h>#include<signal.h>int main(int arg,char *args[]){        if(arg < 2) //如果没有参数,main函数返回                return 0;        else{                int pid = atoi(args[1]);//第一个参数转化为pid                printf("pid = %d\n",pid);                kill(pid,SIGINT);//向指向的pid发送SIGINT信号                return 0;        }}
关于kill函数,可以参考博客:

http://www.cnblogs.com/leeming0222/articles/3994125.html

kill函数并不一定是杀死进程,而是给pid的进程传递信号。

个人理解就是,fork,wait函数都是父子进程的痛心方式,而kill函数则是可以在没有亲属关系的进程间传递信号实现通信。

而这篇博客里面用的waitpid函数,则是父进程等待子进程退出所使用的函数,可以参考博客:

http://blog.csdn.net/kevinhg/article/details/7001719

接收函数的进程recsig:
#include<stdio.h>#include<stdlib.h>#include <unistd.h>#include<signal.h>int status = 0; //定义一个全局变量,0为打印信息,1位不打印信息                           void catch_Signal(int Sign){        switch(Sign)        {        case SIGINT:                if(status == 0)//如果status为0,那么设置status为1,否则设置status为0                        status = 1;                else                        status = 0;                break;        }}int signall(int signo,void (*func)(int)){        struct sigaction act,oact;        act.sa_handler = func;        sigemptyset(&act.sa_mask);        act.sa_flags = 0;        return sigaction(signo,&act,&oact);}int main(int arg,char *args[]){        signall(SIGINT,catch_Signal);//捕捉SIGINT信号        while(1)        {                if(status) //如果为1,打印字符串                {                        printf("hello\n");                }                sleep(1);        }        return 0;}
关于sigaction函数,感觉这个函数是比较难深入了解的,里面涉及一个sigaction结构体

可以参考博客:http://blog.csdn.net/hero06206/article/details/7354124 

这2个程序的运行方式是:

recsig运行,一直在循环,这个时候可以通过进程监视器看到这个进程对应的pid

control正常运行,并且 通过args输入recsig进程pid之后,发送SIGINT给recsig

recsig收到信号之后就会触发捕捉信号的函数,输出hellp

但是更加具体的关于信号处理的结构体的话感觉比较复杂,只能先暂时不深入了解,希望以后如果有机会接触,使用多了就会找机会去深入了解他们