进程间通信(信号,共享内存)

【1】信号

kill-l :显示系统中的信号。

kill -num PID:给pid进程发送num信号。

信号的概念:

1)信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。

2)信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。

3)如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

信号的响应方式:

1.忽略信号:对信号不做任何处理,(SIGKILL   SIGSTOP)不能被忽略

2.捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数,(SIGKILL  SIGSTOP)不能被捕捉.

3.进行缺省操作:Linux对每种信号都规定了默认操作。

信号的种类:

2)SIGINT:结束进程,对应快捷方式ctrl+c

3)SIGQUIT:退出信号,对应快捷方式ctrl+\

9)SIGKILL:结束进程,不能被忽略不能被捕捉

15)SIGTERM:结束终端进程,kill 使用时不加数字默认是此信号

17)SIGCHLD:子进程状态改变时给父进程发的信号

19)SIGSTOP:结束进程,不能被忽略不能被捕捉

20)SIGTSTP:暂停信号,对应快捷方式ctrl+z

26)SIGALRM:闹钟信号,alarm函数设置定时,当到设定的时间时,内核会向进程发送此信号结束进程。

函数接口:

alarm定时   pause挂起


    printf("%d\n",alarm(5));
    printf("hello world\n");
    sleep(1);
    printf("%d\n", alarm(3));
    pause();
    return 0;

kill (pid_t pid,int sig); 指定进程发送信号

raise(int sig);进程向自己发送信号

void  handler(int sig)
{
    if (sig==3)
    {
        printf("hello,world\n");
    }
    

}
int main()
{
    //忽略信号
   // signal(SIGINT ,SIG_IGN) ;
    //缺省操作
   // signal(2,SIG_DFL);
    //捕捉操作
    signal(2,handler);
    pause();
    printf("*********************\n");
    return 0;
}

【2】共享内存

1.特点:

1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝

2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间

3)进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。

4)由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等

2.操作步骤:

  1. 创建key值,ftok
  2. 创建或打开共享内存 shmget
  3. 映射共享内存到地址空间 shmat
  4. 撤销映射 shmdt
  5. 删除共享内存 shmctl

3.函数接口:

int main(int argc, char const *argv[])
{
    key_t key = ftok("./1.c", 'a');
    if (key < 0)
    {
        perror("ftok err");
        return -1;
    }
    printf("key:%#x\n", key);
    int shmid = shmget(key, 128, IPC_CREAT | IPC_EXCL | 0666);
    if (shmid < 0)
    {
         if (errno == 17)
          shmid = shmget(key, 128, 0666);
        else
        {
            perror("shmget err");
            return -1;
        }
    }
    printf("shmid:%d\n", shmid);
    printf("****************************************\n");
    char *p = shmat(shmid, NULL, 0);
    if (p==(void *)-1)
    {
           perror("errorrr"); 
    }
    
    fgets(p, 32, stdin);
    fputs(p, stdout);

    shmdt(p);
    shmctl(shmid,IPC_RMID,NULL);
    return 0;
}

 

命令:

ipcs -m: 查看系统中的共享内存

ipcrm -m shmid:删除共享内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值