导航:首页 > 操作系统 > linux进程发送信号

linux进程发送信号

发布时间:2022-09-01 19:10:47

① 在linux/unix操作系统中用什么命令可以向一个进程发送信号

使用kill命令向进程发信号。
例如,你想向进程“a.out”发送USR1信号,如下所示。
$ ps -C a.out
$ ps -C a.out
PID TTY TIME CMD
PID TTY TIME CMD
3699 pts/1 00:00:00 a.out
3699 pts/1 00:00:00 a.out

② 总结:linux进程间通信的几种机制的比较及适

1 管道(Pipe)及有名管道(namedpipe):
管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2 信号(Signal):
信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
3 报文(Message)队列(消息队列):
消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4 共享内存:
使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5 信号量(semaphore):
主要作为进程间以及同一进程不同线程之间的同步手段。
6 套接口(Socket):
更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和SystemV的变种都支持套接字。

③ linux进程可以向自己发信号吗

kill函数用来发送信号给指定的进程,在Shell下输入man 2 kill可获取其函数原型如下:#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int sig);
该函数的行为与第一个参数pid的取值有关,第二个参数sig表示信号编号。
如果pid是正数,则发送信号sig给进程号为pid的进程;
如果pid为0,则发送信号sig给当前进程所属进程组里的所有进程;
如果pid为-1,则把信号sig广播至系统内除1号进程(init进程)和自身以外的所有进程;
如果pid是-1还小的负数,则发送信号sig给属于进程组-pid的所有进程。
如果参数sig是0,则kill()仍执行正常的错误检查,但不发送信号。可以利用这一点来确定某进程是否有权向另外一个进程发送信号。如果向一个并不存在的进程发送空信号,则kill()返回-1,errno则被设置为ESRCH。
函数执行成功返回0,当有错误发生时则返回-1,错误代码存入errno中,详细的错误代码说明请参考man手册。
注意:只有具有root权限的进程才能向其他任一进程发送信号,非root权限的进程只能向属于同一个组或同一个用户的进程发送信号。

更简单的方法是通过进程名给进程发信号。比如你的进程名是 aproc,你自己定义一个信号量18,那么:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char cmd[256]=""; int sig = 18;
char procname[]="aproc";
sprintf(cmd, "killall -%d %s\n", sig, procname);
system(cmd);
就能给特定进程发信号了

充分利用system函数,可以简化很多编程工作量,比如查IP地址、查硬盘目录、查磁盘空间等等,编程很麻烦的事都能用system处理,相当于在程序里调用SHELL

④ linux关机和重启会给运行中的进程发送信号吗

会的,会发送2个信号:先发送SIGTERM信号,再发送SIGKILL信号,你在进程中如果设置捕获这2个信号就可以监测到系统关机或重启。。。

⑤ linux系统的进程间通信有哪几种方式

一、方式

1、管道(Pipe)及有名管道( mkpipe):

管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

2、信号(Signal):

信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。

linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction。

实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数。

3、消息队列(Message):

消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4、共享内存:

使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

5、信号量(semaphore):

主要作为进程间以及同一进程不同线程之间的同步手段。

6、套接口(Socket):

更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

二、概念

进程间通信概念:

IPC—-InterProcess Communication

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以进程之间要交换数据必须通过内核。

在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

(5)linux进程发送信号扩展阅读

1)无名管道:

管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。

管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,构成两进程间通信的一个媒介。

数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

2)有名管道:

不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间)。

因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。



⑥ linux系统上信号发送和信号接收讲解

用于进程间通信,通信机制由操作系统保证,比较稳定。

在linux中可以通过kill -l查看所有信号的类型。

kill -信号类型 进程ID

int kill(pid_t pid, int sig);
入参pid :
pid > 0: 发送信号给指定的进程。
pid = 0: 发送信号给 与调用kill函数进程属于同一进程组的所有进程。
pid < 0: 取|pid|发给对应进程组。
pid = -1:发送给进程有权限发送的系统中所有进程。
sig :信号类型。
返回值 :成功:0;失败:-1 (ID非法,信号非法,普通用户杀init进程等权级问题),设置errno
以OpenHarmony源码为例,应用ANR后,AbilityManagerService会通知应用mp堆栈信息,就是通过信号量做的。

头文件位置 :
include <signal.h>
函数解释 :
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
当接收到指定的信号signum时,就会跳转到参数handler指定的函数执行。其中handler的入参是信号值。

函数原型

signum参数指出要捕获的信号类型,act参数指定新的信号处理方式,oldact参数输出先前信号的处理方式(如果不为NULL的话)。
sigaction结构体

sa_handler 信号处理函数
sa_mask 在处理该信号时可以暂时将sa_mask 指定的信号集搁置
sa_flags 指定一组修改信号行为的标志。 它由以下零个或多个的按位或组成
   SA_RESETHAND:当调用信号处理函数时,将信号的处理函数重置为缺省值SIG_DFL
   SA_RESTART:如果信号中断了进程的某个系统调用,则系统自动启动该系统调用
   SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号
sa_restorer 是一个替代的信号处理程序,当设置SA_SIGINFO时才会用它。
相关函数
int sigemptyset( sigset_t *set);
sigemptyset()用来将参数set信号集初始化并清空。
执行成功则返回0,如果有错误则返回-1。
完整示例

⑦ linux 下进程间通过信号进行通信的具体实现过程

kill函数用来发送信号给指定的进程,在Shell下输入man 2 kill可获取其函数原型如下:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int sig);
该函数的行为与第一个参数pid的取值有关,第二个参数sig表示信号编号。
如果pid是正数,则发送信号sig给进程号为pid的进程;
如果pid为0,则发送信号sig给当前进程所属进程组里的所有进程;
如果pid为-1,则把信号sig广播至系统内除1号进程(init进程)和自身以外的所有进程;
如果pid是-1还小的负数,则发送信号sig给属于进程组-pid的所有进程。
如果参数sig是0,则kill()仍执行正常的错误检查,但不发送信号。可以利用这一点来确定某进程是否有权向另外一个进程发送信号。如果向一个并不存在的进程发送空信号,则kill()返回-1,errno则被设置为ESRCH。
函数执行成功返回0,当有错误发生时则返回-1,错误代码存入errno中,详细的错误代码说明请参考man手册。
注意:只有具有root权限的进程才能向其他任一进程发送信号,非root权限的进程只能向属于同一个组或同一个用户的进程发送信号。

更简单的方法是通过进程名给进程发信号。比如你的进程名是 aproc,你自己定义一个信号量18,那么:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char cmd[256]=""; int sig = 18;
char procname[]="aproc";
sprintf(cmd, "killall -%d %s\n", sig, procname);
system(cmd);
就能给特定进程发信号了

充分利用system函数,可以简化很多编程工作量,比如查IP地址、查硬盘目录、查磁盘空间等等,编程很麻烦的事都能用system处理,相当于在程序里调用SHELL

⑧ linux系统下进程的信号处理流程是怎么样的

kill函数用来发送信号给指定的进程,在Shell下输入man 2 kill可获取其函数原型如下: #include <sys/types.h> #include <signal.h> int kill(pid_t pid,int sig); 该函数的行为与第一个参数pid的取值有关,第二个参数sig表示信号编号。 如果pid是正数,则发送信号sig给进程号为pid的进程; 如果pid为0,则发送信号sig给当前进程所属进程组里的所有进程; 如果pid为-1,则把信号sig广播至系统内除1号进程(init进程)和自身以外的所有进程; 如果pid是-1还小的负数,则发送信号sig给属于进程组-pid的所有进程。 如果参数sig是0,则kill()仍执行正常的错误检查,但不发送信号。可以利用这一点来确定某进程是否有权向另外一个进程发送信号。如果向一个并不存在的进程发送空信号,则kill()返回-1,errno则被设置为ESRCH。 函数执行成功返回0,当有错误发生时则返回-1,错误代码存入errno中,详细的错误代码说明请参考man手册。 注意:只有具有root权限的进程才能向其他任一进程发送信号,非root权限的进程只能向属于同一个组或同一个用户的进程发送信号。 更简单的方法是通过进程名给进程发信号。比如你的进程名是 aproc,你自己定义一个信号量18,那么: #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> char cmd[256]=""; int sig = 18; char procname[]="aproc"; sprintf(cmd, "killall -%d %s\n", sig, procname); system(cmd); 就能给特定进程发信号了 充分利用system函数,可以简化很多编程工作量,比如查IP地址、查硬盘目录、查磁盘空间等等,编程很麻烦的事都能用system处理,相当于在程序里调用SHELL

阅读全文

与linux进程发送信号相关的资料

热点内容
找酒吧设计公司用什么app 浏览:680
基本初等函数的导数公式及导数的运算法则 浏览:915
为什么小米app启动广告关不了 浏览:877
空调压缩机一直不停 浏览:511
养殖系统开发源码 浏览:82
pdf的目录 浏览:406
光遇安卓如何一个人拍视频 浏览:277
怨女pdf 浏览:708
扭曲服务器什么时候开 浏览:23
加密货币换平台 浏览:609
手机内存压缩软件 浏览:33
生成树是否与遍历算法有关 浏览:728
python强化学习迷宫 浏览:450
老包子解压视频 浏览:885
服务器注册是什么意思 浏览:418
程序员群体焦虑如何破局 浏览:585
程序员在广州上班 浏览:803
androidlinuxadt 浏览:512
广联达软件加密锁原装芯片 浏览:338
如何打开数据库服务器 浏览:312