信号处理和共享内存

    xiaoxiao2021-03-25  163

    一、共享内存

    1、步骤:

    shmget()创建共享内存

    shmat()映射

    存取操作

    shmdt()解除映射

    shmctl()释放共享内存

     

    2、函数分析

    (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); } }

     

     

    二、信号处理

    1、Kill()函数

    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为组标识的进程。

     

    2、raise()函数

    int raise(int signal);

    向自身发送信号。

     

    3、alarm()闹钟函数

    unsigned int alarn(unsigned int seconds);

    经过seconds秒后产生一个信号,且一个进程只能有一个闹钟时间。如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的seconds值是0,则取消以前的闹钟时钟,其余留值仍作为alarm函数的返回值。

     

    4、signal()函数

    void( * signal(int signo,void(* func)(int)))(int);

    表示接收到新号之后随即执行func()函数,执行完之后再返回被中断的点继续执行。

    signo:

    SIG_IGN 表示忽略信号

    SIG_DEL 表示默认操作

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1699.html

    最新回复(0)