这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【每日总结】liklon从零学嵌入式Linux

共87条 4/9 |‹ 2 3 4 5 6 7 ›| 跳转至
菜鸟
2014-05-07 16:17:06     打赏
31楼

好,正想民学习学习呢


高工
2014-05-07 20:29:25     打赏
32楼
一起学习,多多交流

高工
2014-05-07 20:32:06     打赏
33楼
嗯嗯,每天一点点,直到熟悉这东西

菜鸟
2014-05-08 11:36:50     打赏
34楼
这个必须顶一下楼主很好的帖子

菜鸟
2014-05-08 12:20:33     打赏
35楼
学习.........

高工
2014-05-10 08:35:10     打赏
36楼
回校途中,停工几天!

院士
2014-05-10 11:25:33     打赏
37楼
准了~~

工程师
2014-05-11 15:33:37     打赏
38楼
楼主用的什么板子呢,我这块用树莓派或者bbb,不知道了行不。。。

助工
2014-05-13 17:57:15     打赏
39楼
谢谢楼主的分享!

高工
2014-05-19 02:06:46     打赏
40楼

十二、信号通信(未完待续....)

信号通信也是进程通讯的一种方式,其产生主要有以下四种方式:
1
、用户按下按键

2、硬件异常

3、进程用kill函数将信号发送到另一个进程

4、用户用kill命令将信号发送给其他进程

 

当进程接受到了信号时,可以有以下三种处理方式:

1、忽略此信号(注意SIGKILLSIGSTOP不能忽略)

2、执行用户希望的动作

3、执行系统默认动作

1、发送信号

包含头文件:       

           #include<sys/types.h>

            #include<signal.h>

          int kill(pid_t pid,int signo)

          参数:pid:信号所要发到的进程

          Signo:信号

          Kill可以向自身进程发送信号,也可以向其他进程发送信号       

          Killpid参数:

               1pid>0        将信号发送到进程号为pid的进程

               2pid=0        将信号发送到同组的进程

               3pid<0        将信号发送到其他组ID=pid绝对值的进程

               4pid=-1       将信号发送到所有进程

 

          int raise(int signo)

          参数:signo:信号

          Raise只能向自身发送信号,所以不需要pid参数

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    pid_t pid;
    
    if((pid = fork()) < 0)
    {
        printf("fork error\n");
        exit(1);
    }
    if(pid == 0)
    {
         printf("child (pid = %d) is waitting for any signal\n",getpid());
         raise(SIGSTOP);
         exit(0);
    }
    else
    {
         if(waitpid(pid,NULL,WNOHANG) == 0)
         {
             if(kill(pid,SIGKILL) == 0)
             {
                 printf("parent kill %d\n",pid);
             }
         }
    }
    waitpid(pid,NULL,0);
    printf("waitpid end\n");
    exit(0);
}

 


alarm函数

包含头文件:#include<unistd.h>

            Unsigned int alarm(unsigned int seconds)

           经过了指定的seconds秒后,给自己发SIGALRM信号

 pause

包含头文件:#include<unistd.h>

            Int pause(void)

使进程挂起直至进程捕捉到一个信号,挂起才结束



#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    if(alarm(5) < 0)
    {
        printf("alarm error\n");
        exit(1);
    }
    pause();
    printf("hi\n");
}

 


2、信号处理

有了信号的发送以及捕获,那么接下来是对信号的具体处理。一个进程可以选择忽略某些信号而只处理其他一些信号,另外,一个进程还可以选择如何处理信号。首先需要建立进程与其信号之间的对应关系,这就是信号处理。

signal

包含头文件:#include<signal.h>

       Void (* signal(int signo,void (*func)(int)))(int)

指定信号的响应函数,当进程接收到此注册信号(signo)时,就会调用响应函数func

Func的取值:

       1SIG_IGN:忽略此信号

       2SIG——DFL:系统默认方式处理

       3、信号处理函数名:使用该函数处理

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void myfun(int sign_no)
{
    if(sign_no == SIGINT)
    {
        printf("get sigint \n");
    }
    else if(sign_no == SIGQUIT)
    {
        printf("get sigquit \n");
    }
}

int main()
{
    printf("get signal\n");
    signal(SIGINT,myfun);
    signal(SIGQUIT,myfun);
    pause();
    exit(0);
}

 





共87条 4/9 |‹ 2 3 4 5 6 7 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]