shmget()创建共享内存
shmat()映射
存取操作
shmdt()解除映射
shmctl()释放共享内存
(1)int shmget(key_t key,int size,int shmflg);
key:标识共享内存的键值,0和IPC_PRIVATE。
size:共享内存的大小
shmflg:权限设置
IPC_CREAT|IPC_EXCL 不存在则创建,存在则报错。
函数执行成功则返回共享内存标识符shmid,否则返回-1。
(2)char * shmat(int shmid,char * shmaddr,int flag);
shmid:共享内存的标识符
shmaddr:一般为NULL,表示系统分配空间地址。
flag:
0 - 可读可写
shm_RDONLY - 只读 ...
(3)shmdt(char * shmaddr);
(4)shmctl(int shmid,int cmd,struct shmid_ds * buf);
cmd:
IPC_RMID: 释放
IPC_STAT:读
IPC_SET:写
buf :设为NULL同时cmd设为IPC_RMID即为释放操作。
shmread:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/shm.h> #include<string.h> #include "shared.h" int main() { int running = 1; void * shm; struct shared * shared; int shmid; shmid = shmget((key_t)12345,2048,IPC_CREAT|0644); if(shmid == -1) { perror("shmget error"); exit(-1); } shm = shmat(shmid,NULL,0); if((void *)-1 == shm) { perror("shmat error"); exit(-1); } shared = (struct shared *)shm; shared -> writting = 0; while(running) { if(shared -> writting != 0) { sleep(rand()%3); printf("The text is %s\n",shared -> text); shared -> writting = 0; if(strncmp(shared -> text,"end",3) == 0) { running = 0; } } } if(-1 == shmdt(shm)) { perror("shmdt error"); exit(-1); } }shmwrite:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/shm.h> #include<string.h> #include "shared.h" int main() { int running = 1; void * shm; struct shared * shared; int shmid; char buf[2048]; shmid = shmget((key_t)12345,2048,IPC_CREAT|0644); if(shmid == -1) { perror("shmget error"); exit(-1); } shm = shmat(shmid,NULL,0); if((void *)-1 == shm) { perror("shmat error"); exit(-1); } shared = (struct shared *)shm; while(running) { while(shared -> writting != 0) { sleep(1); printf("wait...\n"); } // memset(buf,0,sizeof(buf)); printf("Please input :\n"); fgets(buf,2048,stdin); buf[strlen(buf) -1] = '\0'; strncpy(shared -> text,buf,strlen(buf)+1); shared -> writting = 1; if(strncmp(buf,"end",3) == 0) { running = 0; } } if(-1 == shmdt(shm)) { perror("shmdt error"); exit(-1); } if(-1 == shmctl(shmid,IPC_RMID,NULL)) { perror("shmctl error"); exit(-1); } }
int kill(pid_t pid,int signal);
向指定进程发送信号。
pid:
1. pid>0时,pid是信号欲送往的进程的标识。2. pid=0时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。3. pid=-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。4. pid<-1时,信号将送往以-pid为组标识的进程。
int raise(int signal);
向自身发送信号。
unsigned int alarn(unsigned int seconds);
经过seconds秒后产生一个信号,且一个进程只能有一个闹钟时间。如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的seconds值是0,则取消以前的闹钟时钟,其余留值仍作为alarm函数的返回值。
void( * signal(int signo,void(* func)(int)))(int);
表示接收到新号之后随即执行func()函数,执行完之后再返回被中断的点继续执行。
signo:
SIG_IGN 表示忽略信号
SIG_DEL 表示默认操作