进程间通信的方式——信号

进程间通信的方式大概有5+种:

1.管道:

这句命令的意思就是将ls这个进程拿到的结果作为grep进程的输入实现了进程间的通信,这个就是管道。

2.消息队列

3.共享内存

消息队列和共享内存不好演示。233

消息队列就是内核给我们创建的一个消息队列。操作系统中的多个进程都可以操作这个消息队列,可以往它里面发送、接收消息。

共享内存是每一个进程在访问内存的时候会有一个虚拟内存地址和物理内存地址的映射,一般2个进程的虚拟内存地址可以是一样的,但是映射的物理内存地址是不一样的。共享内存就是将他们的物理内存地址也变为一样的,这个时候2个进程就可以同时访问相同的一块物理内存,借助这块物理内存实现通信了。

4.套接字:

例如访问mysql通过3306端口。访问数据库这个进程和数据库这个进程本身这2个进程的通信就是通过3306端口建立起的tcp套接字。

本机访问mysql不会走tcp的套接字,而是走linux底层的套接字。

5.信号量:

类似计数器,控制多个进程对一个共享的资源的访问,最多这个资源能被多少进程访问,起到控制数量锁的机制。

6. 信号:

信号是一个进程可以向另一个进程发送一个信号。这个进程可以去处理信号。

Linux中的信号包括哪些:

列出所有信号:

kill是杀死,看似和信号没关系。但是linux中的信号大多是把另一个进程杀死,所以指令就叫kill了。

常用的信号没有64个这么多。


示例:

发送了tail信号,这个进程一直阻塞运行,如果想停止,一般都ctrl+c:

ctrl+c其实就是 当前shell向tail -f这个进程发送一个信号,这个信号的值为2(SIGINT)

再打开一个窗口,

可以看到tail这个进程号是20576.

这样就将运行的tail进程杀死了,这个信号是SIGTERM中断信号。

再次运行tail -f

通过9号信号也能将进程终止,此时它是一个SIGKILL信号。不加参数其实发送的是15号信号SIGTERM信号。


程序实操:

idea中的终端按住ctrl+c停止不了。于是先build然后在系统终端中打开:

此时可以发现程序并没有停止而是将我们这个信号给捕捉到了。

此时只能通过kill指令来停止,windows没有kill指令,通过taskkill.exe来停止。

上面杀死的是强制杀死的kill信号。

下面介绍捕捉kill信号:

发现kill信号是不能被捕捉的。

这是一个约定:只要发送kill信号,无论这个信号怎么顽强都要被杀死才行。

build一下项目后打包到linux运行[linux命令多一些]:

出现这个错误的原因是没有指定jar中哪个类作为运行的主类。

一个类也需要指定主类。

java -cvf 1.jar .

这是打包命令。最后有个点.是指需要打包的文件都有什么。点表示全部。

用压缩软件打开刚刚打包的jar:

再运行java -jar可以运行。

在linux中通过kill指令杀死此jar包运行在linux上的进程号,就可以看到没有被杀死,是因为kill默认不加参数是用的SIGTERM信号,TERM信号又在我们写的程序中捕捉了。

但是kill -9 进程号,就可以杀死了,因为这种发送的是9信号SIGKILL信号,kill 是无法被程序处理的。

发布了288 篇原创文章 · 获赞 40 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_39969226/article/details/104056565