一、信号
1.信号
1、信号:软中断(程序间传输信息的媒介)
Ctrl+z:暂停信息
Ctrl+c:停止信号
int kill(pid_t pid, int sig);
信号处理
sighandler_t signal(int signum, sighandler_t handler);
signum:信号编号
sighandler_t handler:信号处理机制
SIG_IGN:忽略信号
SIG _DFL:信号的直接处理
代码
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void handler(int sig)
{
printf("sig:%d\n",sig);
}
int main()
{
signal(SIGINT,handler );
int i=0;
while(1)
{
printf("i=%d\n",i++);
sleep(1);
}
return 0;
}
二、共享内存
无格式:
存在意义:当数据量大且读写效率较高的时候
为什么读写效率高:读写效率高减少了进出内核的次数
内核实现的原理?
1.定义
在内存中开辟一块内存可以让多个进程共享(相当于malloc)
如果一个进程对于共享内存的内容进行了更改,其他进程都会受到影响
一个共享内存的最大容量:shnmax(不推荐手动调用)
Posix: 系统V mmap:
2、开辟共享内存
2、开辟共享内存
shmget函数
头文件
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
共享内存的键值: 0
IPC_PRIVATE:创建一块新的共享内存
返回值shmid:共享内存的标识符
shmfig:IPC_CREAT:
3、shmat函数
映射共享内存:shmat
头文件
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
(int shmflg 决定以什么方式来确定映射地址一般为0)
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
struct data
{
char dat[100];
};
int main()
{
struct data *prt;
pid_t pid;
int status;
int shmid = shmget(1, sizeof(struct data), 0666|IPC_CREAT);
if(-1 == shmid)
{
perror("shmget error!");
exit(1);
}
prt = (struct data*)shmat(shmid, NULL, 0);
//第一个参数是shmget返回的标识符,
//第二个参数 如果 shmaddr 是NULL,系统将自动选择一个合适的地址!
//第三个参数如果在flag中指定了SHM_RDONLY位,则以只读方式连接此段,否则以读写的方式连接此段,shmat返回值是该段所连接的实际地址 如果出错返回-1
if(prt == (void *) - 1)
{
perror("shmat error");
exit(1);
}
scanf("%s",prt->dat);
pid = fork();
if(-1 == pid)
{
perror("error");
exit(1);
}
if(0 == pid)
{
printf("child:%s\n", prt->dat);
scanf("%s", prt->dat);
exit(3);
}
else
{
pid = wait(&status);
printf("father: %s \n",prt->dat);
}
int shm = shmctl(shmid, IPC_RMID, NULL);
if(-1 == shm)
{
perror("shmctl error");
exit(1);
}
return 0;
}
4.关于创建共享内存的步骤
1、进程调用shmget函数创建新的或获取已有的共享内存
2、调用shmat函数将物理内存映射到自己的进程空间
3、调用shmdt函数取消映射
4、调用shmtl函数释放开辟的物理空间
int **ptr:二级指针 ,也就是指向指针的指针
int (*ptr)
int ************IP2=&IP11
static
extern
const
auto
regist
typedef #define两者区别
volatile