系统调用signal
时间: 2023-12-14 12:02:14 浏览: 23
signal是一个系统调用,用于在进程间传递信号。它允许进程将信号处理程序与特定信号相关联,以便在接收到该信号时执行某些操作。例如,当进程收到SIGINT信号时,它可以执行一个处理程序来清理资源并退出。
signal的语法如下:
```c
void (*signal(int sig, void (*handler)(int)))(int);
```
其中,sig是要处理的信号,handler是一个指向信号处理程序的指针。signal返回一个指向以前信号处理程序的指针。
例如,以下代码将SIGINT信号处理程序设置为my_handler:
```c
#include <stdio.h>
#include <signal.h>
void my_handler(int sig) {
printf("Received signal %d\n", sig);
}
int main() {
signal(SIGINT, my_handler);
while(1) {}
return 0;
}
```
在这个例子中,当用户按下Ctrl+C时,进程将收到SIGINT信号,并执行my_handler函数。
相关问题
用系统调用signal()让父进程捕捉键盘上来的中断信号(Ctrl-C);
在 Unix/Linux 系统中,我们可以使用 signal() 系统调用来注册信号处理函数,以处理接收到的信号。为了让父进程能够捕捉键盘上来的中断信号(Ctrl-C),我们可以在父进程中调用 signal() 函数,注册 SIGINT 信号的处理函数。具体代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sigint_handler(int sig) {
printf("Received signal %d\n", sig);
exit(0);
}
int main() {
signal(SIGINT, sigint_handler);
printf("My PID is %d\n", getpid());
while (1) {
printf("Waiting for signal...\n");
sleep(1);
}
return 0;
}
```
在上面的代码中,我们定义了一个 sigint_handler() 函数,用于处理 SIGINT 信号(即键盘上来的中断信号)。在 main() 函数中,我们调用 signal() 函数,将 SIGINT 信号的处理函数设置为 sigint_handler()。这样,当父进程接收到 SIGINT 信号时,就会调用 sigint_handler() 函数来处理它。在 sigint_handler() 函数中,我们打印出接收到的信号编号,然后调用 exit() 函数来退出进程。
在 main() 函数中,我们使用一个无限循环来等待信号的到来。每隔一秒钟打印一次提示信息,等待 SIGINT 信号的到来。如果接收到 SIGINT 信号,就会调用 sigint_handler() 函数来处理它,然后退出进程。
使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。而父进程等待2个子进程终止后,输出信息“Parent process is killed!”后终止。程序流程图
程序流程图:
```
+------------------+
| Parent |
+------------------+
| |
signal(SIGINT) waitpid(p1)
| |
kill(p1) waitpid(p2)
| |
| |
+------+ +------+
| p1 | | p2 |
+------+ +------+
| |
signal(SIGUSR1) signal(SIGUSR2)
| |
"p1 is killed" "p2 is killed"
| |
exit() exit()
```
具体步骤:
1. 使用系统调用fork()创建2个子进程p1和p2。
2. 在父进程中使用系统调用signal()捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C)。
3. 当捕捉到软中断信号SIGINT后,父进程使用系统调用kill()分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2。
4. 子进程p1和p2分别捕捉到信号SIGUSR1和SIGUSR2后,输出信息“Child process p1 is killed by parent!”或“Child process p2 is killed by parent!”。
5. 子进程p1和p2终止。
6. 父进程使用waitpid()等待子进程p1和p2终止。
7. 父进程输出信息“Parent process is killed!”后终止。