6、linux进程间通信之信号通信

news/2024/5/19 0:34:25 标签: linux, signal, kill, 存储, unix, fun
 

       信号通信

     信号(signal)机制是unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号。

²        当用户按下某些按键时,产生信号。

²        硬件异常产生信号:除数为0,无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程。例如,内核对正在访问一个无效的存储区的进程产生一个SIGSEGV信号。

²        进程用kill函数将信号发送给另一个进程

²        用户可以用kill命令将信号发送给其他进程

                     信号处理:

Ø         忽略此信号

大多数信号都是按这种方式处理。但是SIGKILL和SIGSTOP不能被忽略,        因为它们是向超级用户提供了一种终止或停止进程的方法

Ø         执行用户希望的动作

Ø         执行系统默认动作

大多数信号的系统默认动作是终止该进程

 

 

发送信号

主要函数有:kill 与raise

区别:

Kill既可以向自己发送信号,也可以向其他进程发送信号。Raise函数是向进程自身发送信号。

#include<sys/types.h>

#include<signal.h>

int kill (pid_t pid ,int signo)

int raise(int signo)

 

kill的pid参数有四种不同的情况

A.        Pid>0 将信号发送给进程ID为pid的进程

B.        Pid=0 将信号发送给同组的进程

C.        Pid<0 将信号发送给其进程组ID等于pid绝对值的进程

D.       Pid=-1 将信号发送给所有进程。

 

alarm

使用alarm函数可以设置一个时间值(闹钟时间),当所设置的时间到了时,产生SIGALRM信号。如果不捕捉此信号,则默认动作是终止该进程。

#include<unistd.h>

Unsigned int alarm(unsigned int seconds)

Seconds:经过了指定的seconds秒后会产生信号SIGALRM.

 

 

 

Pause

Pause函数使调用进程挂起直至捕捉到一个信号。

#include<unistd.h>

int pause(void)

只有执行了一个信号处理函数后,挂起才结束。

 

 

Signal

#include<signal.h>

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

                          如何理解????

                       //函数指针包含一个函数指针返回函数指针

Typedef void (*sighandler_t)(int)      //(*sighandler_t)(int)为void

Sighandler_t signal(int signum,sighandler_t handler)

 

Func可能值是:

l         SIG_IGN 忽略此信号

l         SIG_DFL 按系统默认的方式处理

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

 

 

例题:mysignal.c

        #include <signal.h>

        #include <stdio.h>

        #include <stdlib.h>

        void my_func(int sign_no)

        {

        if(sign_no==SIGINT)

        printf("I have get SIGINT\n");

            else if(sign_no==SIGQUIT)

        printf("I have get SIGQUIT\n");

        }

        int main()

        {

            printf("Waiting for signal SIGINT or SIGQUIT \n ");

        /*注册信号处理函数*/

        signal (SIGINT, my_func);

        signal(SIGQUIT, my_func);

        pause();                                    //等待信号

        exit(0);                                    //安全退出

    }

       

       

 

         如何测试?????

        1)./mysignal

            Waiting for signal SIGINT or SIGQUIT

       2)man kill

 

     3) ps aux

   

 

      4) kill –s SIGQUIT  9988

   

 

  然后:

   

 

       
kill">

http://www.niftyadmin.cn/n/1262366.html

相关文章

JS定时保存表单数据(UserData 行为)

我相信有不少TX用过QQ或163的邮箱吧&#xff1f;他们中有一个比较有用且有趣的功能&#xff0c;如果您在编写邮件&#xff0c;那在固定一个时间频率内&#xff0c;它会自动将您的邮件内容保存起来&#xff0c;以免丢失。&#xff08;忘记是不是两家邮箱都有这个功能&#xff09…

7、linux进程间通信之共享内存

共享内存 共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法&#xff0c;一个进程向共享内存区域写入了数据&#xff0c;共享这个内存的区域的所有进程就可以立刻看到其中的内容。 共享内存实现可以分为两个步骤&#xff1a; 创建…

跌跌撞撞的往前走

今天&#xff0c;领到了自己的第一份软件工作的工资&#xff0c;今天&#xff0c;工作已经一个来月了&#xff0c;今天&#xff0c;我的博客开通啦&#xff01; 这一个月&#xff0c;每天都在谷歌百度上找别人的东西&#xff0c;能借鉴别人的经验真是非常的难得&#xff0c;他人…

8、linux进程间通信之消息队列

消息队列 定义&#xff1a; Unix早期的通信机制之一的信号能够传送的信息量有限&#xff0c;管道则只能传 送无格式的字节流&#xff0c;这无疑会给应用程序的开发带来不便。消息队列&#xff08;也叫报文队列&#xff09;则克服了这些缺点。 发展&#xff1a; 消息队列就…

Android之Fragment静态实现实例

Fragment是作为Activity的UI的一部分&#xff0c;它内嵌在Activity中&#xff0c;多个Fragment可以把一个Activity分成多个部分&#xff0c;这在大屏幕手机或者平板电脑中会比较多的用到&#xff0c;这样就不用使用多个Activity来切换这么麻烦了。当然Fragment也可以不显示&…

9、linux进程间通信之信号量

信号量 信号量&#xff08;又名&#xff1a;信号灯&#xff09;与其他进程间通信方式不大相同&#xff0c;主要用途是保护临界资源。进程可以根据它判断是否能够访问某些共享资源。除了用于访问控制外&#xff0c;还可以用于进程同步。 。 如图&#xff1a;当A要访问S时&#…

10、linux多线程程序设计

多线程 优点&#xff1a; 和进程相比&#xff0c;它是一种节俭的多任务操作方式&#xff08;与父进程共享&#xff09;。在linux系统中&#xff0c;启动一个新的进程必须分配给他独立的地址空间&#xff0c;建立众多的数据表来维护他的代码段&#xff0c;堆栈段&…

11、线程等待与清除

线程等待 #include<pthread.h> int pthread_join (pthread_t tid , void **rval_ptr) 功能&#xff1a; 阻塞调用线程&#xff0c;直到指定的线程终止 1)Tid:等待退出的线程ID 2)Rval_ptr 线程退出的返回值的指针 例题1.thread_join.c #include <pthread.h> #inc…