1.进程A向进程B发送SIGUSR1信号;
2.进程B收到信号后,打印字符串“receive SIGUSR1”;
3.要求用kill函数和signal函数实现以上功能;
signal.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
1.信号发送函数—kill()
#include <sys/types.h> #include <signal.h> int kill(pid_t pid,int signo)
功能
向进程或进程组发送一个信号 (成功返回 0; 否则,返回 -1 )
参数说明
pid:接收信号的进程(组)的进程号
pid>0:发送给进程号为pid的进程
pid=0:发送给当前进程所属进程组里的所有进程
pid=-1:发送给除1号进程和自身以外的所有进程
pid<-1:发送给属于进程组-pid的所有进程
signo:发送的信号
Signo = 0:不发送信号,可用于检查目标进程是否存在,以及当前进程是否具有向目标进程发送信号的权限(root权限的进程可以向任何进程发送信号,非root权限的进程只能向属于同一个session或者同一个用户的进程发送信号)。
2.信号安装函数—signal()
原型定义
void (*signal(int signum, void (*handler)(int)))(int);
参数说明
signum:需要安装的信号
handler:与安装信号相关的处理函数,可以是SIG_IGN或SIG_DFL
SIG_IGN:忽略该信号
SIG_DFL:执行默认操作函数
返回值
成功时,返回新安装信号处理函数handler的返回值
失败时,返回SIG_ERR
底层系统调用
sys_signal(int sig, __sighandler_t handler)
3.要求用kill函数和signal函数实现以上功能;
源代码:
kill.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
void kill_usr(int pid);
int main(int argc)
{
int a;
printf("请输入要接收信号的pid\n");
scanf("%d",&a);
kill_usr(a);
{
int a;
printf("请输入要接收信号的pid\n");
scanf("%d",&a);
kill_usr(a);
return 0;
}
void kill_usr(int pid)
{
kill(pid,SIGUSR1);
}
}
void kill_usr(int pid)
{
kill(pid,SIGUSR1);
}
signal.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sig_usr(int sig);
int main()
{
if(signal(SIGUSR1,sig_usr)==SIG_ERR)
{
printf("signal error");
}
int main()
{
if(signal(SIGUSR1,sig_usr)==SIG_ERR)
{
printf("signal error");
}
printf("%d\n",getpid());
pause();
pause();
return 0;
}
}
void sig_usr(int sig)
{
printf("receive SIGUSR1\n");
}
{
printf("receive SIGUSR1\n");
}
1.信号发送函数—kill()
#include <sys/types.h> #include <signal.h> int kill(pid_t pid,int signo)
功能
向进程或进程组发送一个信号 (成功返回 0; 否则,返回 -1 )
参数说明
pid:接收信号的进程(组)的进程号
pid>0:发送给进程号为pid的进程
pid=0:发送给当前进程所属进程组里的所有进程
pid=-1:发送给除1号进程和自身以外的所有进程
pid<-1:发送给属于进程组-pid的所有进程
signo:发送的信号
Signo = 0:不发送信号,可用于检查目标进程是否存在,以及当前进程是否具有向目标进程发送信号的权限(root权限的进程可以向任何进程发送信号,非root权限的进程只能向属于同一个session或者同一个用户的进程发送信号)。
2.信号安装函数—signal()
原型定义
void (*signal(int signum, void (*handler)(int)))(int);
参数说明
signum:需要安装的信号
handler:与安装信号相关的处理函数,可以是SIG_IGN或SIG_DFL
SIG_IGN:忽略该信号
SIG_DFL:执行默认操作函数
返回值
成功时,返回新安装信号处理函数handler的返回值
失败时,返回SIG_ERR
底层系统调用
sys_signal(int sig, __sighandler_t handler)