2019-2020-1 20175313 《信息安全系统设计基础》第十周学习总结

时间:2019-12-01 13:23:44   收藏:0   阅读:62

一、Linux进程间通信(一)——管道

1.管道概述

管道是Linux中进程间通信的一种方式。这里所说的管道主要指无名管道,它具有以下特点:

2.管道系统调用

(1)创建管道

(2)创建子进程

通过fork()函数创建一子进程,该子进程会继承父进程所创建的管道。

(3)关闭相应描述符

3.标准流管道

(1)popen()函数简介

标准流管道将一系列的创建过程合并到一个函数popen()中完成。它所完成的工作有以下几步:

(2)popen()函数详解

4.管道的局限性

二、Linux进程间通信(二)——有名管道

1.有名管道概述

有名管道(named pipe或FIFO)克服了无名管道只能用于具有亲缘关系的进程之间、没有名字的局限性。

2.有名管道的相关操作

三、Linux进程间通信(三)——信号量

1.信号量概述

信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)。其中信号量对应于某一种资源,取一个非负的整型值。信号量值指的是当前可用的该资源的数量,若它等于0 则意味着目前没有可用的资源。

PV原子操作的具体定义如下:

2.信号量的使用步骤

(1)创建信号量

参数详解

(2)初始化信号量

使用semctl()函数的SETVAL操作

技术分享图片

(3)进行信号量的PV 操作

调用semop()函数

技术分享图片

(4)删除不再使用的信号量
使用semclt()函数的IPC_RMID 操作

四、教材实例分析

#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdlib.h>
#include<unistd.h>
#define DELAY_TIME 3

int main()
{
    pid_t result;
    int sem_id;
    sem_id=semget(ftok(".",'a'),1,0666|IPC_CREAT);
    init_sem(sem_id,0);
    result=fork();
    if(result==-1)
    {
        printf("Error\n");
    }
    else if(result==0)
    {
        printf("Child process will wait for some second...\n");
        sleep(DELAY_TIME);
        printf("The returned value is %d in the child process(PID=%d)\n",result,getpid());
    //  sem_v(sem_id);
    }
    else{
    //  sem_p(sem_id);
        printf("The returned value is %d in the father process(PID=%d)\n",result,getpid());
    //  sem_v(sem_id);
    //  del_sem(sem_id);
    }
    exit(0);
}
union semum
{
    int val;
    struct sem_id_ds *buf;
    unsigned short *array;
};
int init_sem(int sem_id,int init_value)
{
    union semum sem_union;
    sem_union.val=init_value;
    if(semctl(sem_id,0,SETVAL,sem_union)==-1)
    {
        perror("Initialize semaphore");
        return -1;
    }return 0;
}
int del_sem(int sem_id)
{
    union semum sem_union;
    if(semctl(sem_id,0,IPC_RMID,sem_union)==-1)
    {
        perror("Delete semaphore");
        return -1;
    }
    return 0;
}
int sem_p(int sem_id)
{
    struct sembuf sem_b;
    sem_b.sem_num=0;
    sem_b.sem_op=-1;
    sem_b.sem_flg=SEM_UNDO;
    if(semop(sem_id,&sem_b,1)==-1)
    {
        perror("P operation\n");
        return -1;
    }return 0;
}

int sem_v(int sem_id)
{
    struct sembuf sem_b;
    sem_b.sem_num=0;
    sem_b.sem_op=1;
    sem_b.sem_flg=SEM_UNDO;
    if(semop(sem_id,&sem_b,1)==-1)
    {
        perror("P operation\n");
        return -1;
    }return 0;
}

五、参考资料

原文:https://www.cnblogs.com/xiannvyeye/p/11965544.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!