共享内存相关概念和使用函数:
共享内存是在多个进程之间共享和传递数据的一种方式。它允许两个不相关的进程访问同一个逻辑内存,共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。
共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到他们自己的地址空间中。所有进程都可以访问共享内存的地址。如果一个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。
1、信号事件的发生的两个来源
①硬件来源(比如说是按下了键盘或者其他硬件故障)②软件来源
2、常用的发送信号的函数
kill函数,raise函数,alarm函数
3、常用的信号
SIGHUP:从终端上发出的结束信号
SIGINT:来自键盘的中断信号
SIGKILL:该信号结束接收信号的进程,杀死进程
SIGTERM:kill命令发出的信号
4、信号发送函数
Kill函数
函数的作用:传送信号给指定的进程
函数的原型:int kill(pid_t pid,int sig)
函数的参数:pid:pid>0指定的进程pid
pid=0 发送给目前进程相同进程组的所有进程
pid=-1 广播给系统内所有的进程
pid<0 传给进程组识别码为pid绝对值得所有进程
sig:信号
函数的返回值:成功:0;出错:-1
头文件:#include<sys/types>
#include<signal.h>
函数实现代码:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int ret;
if((pid=fork()) < 0)
{
perror("fork");
exit(1);
}
if(pid == 0)
{
raise(SIGSTOP);
exit(0);
}
else
{
printf("pid=%d\n", pid);
if((waitpid(pid, NULL, WNOHANG)) == 0)
{
kill(pid,SIGKILL);
printf("kill %d\n", pid);
}
else
{
perror("kill");
}
}
}
raise函数
函数的作用:发送信号给自身
函数的原型:int raise(int sig)
头文件:#include<signal.h>
函数实现代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
int main()
{
pid_t pid;
int ret;
if((pid= fork()) < 0)
{
printf("Fork error.\n");
exit(-1);
}
if(pid == 0)
{
printf("child (pid:%d) is waiting for any signal\n.", getpid());
raise(SIGSTOP);
exit(0);
}
else
{
if((waitpid(pid, NULL, WNOHANG)) == 0)
{
kill(pid, SIGKILL);
printf("parent kill child process %d\n", pid);
}
waitpid(pid, NULL, 0);
exit(0);
}
}
alarm函数
函数的作用:设置信号传送闹钟
函数的原型:unsigned int alarm(unsigned int seconds)
函数的返回值:返回之前闹钟的剩余秒数
函数实现队列:
#include<unistd.h>
#include<signal.h>
void handler()
{
printf(“hello\n”);
}
int main()
{
int i;
signal(SIGALRM,handler);
alarm(5);
for(i = 0;i < 7;i++)
{
printf(“sleep %d ...\n”,i);
sleep(1);
}
}
pause函数
函数的作用:让进程暂停直到信号出现
函数的原型:int pause(void)
函数的返回值:-1
signal函数
函数的作用:设置信号处理方式
函数的原型:void (*signal(int signum,void (*hander)(int)))(int)
函数的返回值:成功:返回先前的信号处理函数指针;出错:-1
函数实现代码:
#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);
}