linux作业1

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <wait.h>

//共享内存部分
#define SHM_SIZE 8*32  //共享内存总大小
#define SHM_BUF_SIZE SHM_SIZE - sizeof(int)*2  //共享内存实际存储字符数组大小
#define SHM_FLAGS IPC_CREAT | SHM_W  |SHM_R      //创建共享内存的MODE
#define SHM_KEY 1234            //共享内存对应唯一的key值
#define SHM_KEY_B 1235          //共享内存对应唯一的key值

//信号量部分
//信号量对应的唯一的字符串
#define A_FULL "a_full"
#define A_EMPTY "a_empty"
#define B_FULL "b_full"
#define B_EMPTY "b_empty"
#define SEM_ORDER "SEM_ORDER"
#define SEM_FLAGS 0666                              //创建信号量的MODE

//杂项
#define A_TURN 0            //该A了
#define B_TURN 1            //该B了
#define OUT_PUT_FILE "../output.txt"   //输出文件
#define F_NAME "source1"             //输入文件
#define BUFF_SIZE 8    //临时的buffer大小,用来接收从文件读取的字符

typedef struct shm_struct_t{
    //共享内存结构体
    int size;
    int flag;
    char buf[SHM_BUF_SIZE];
}shm_struct;

//两个辅助函数
int my_strncpy(shm_struct *dest, char* source,int size);
int my_tolower(char * str,int len);

int main(int argc,char ** argv) {
    pid_t child;
    int shm_id,shm_id_b;
    sem_t *sem_order,*a_full,*a_empty,*b_full,*b_empty;


    sem_unlink(SEM_ORDER);
    sem_unlink(A_EMPTY);
    sem_unlink(A_FULL);
    sem_unlink(B_EMPTY);
    sem_unlink(B_FULL);

    //开始创建信号量
    sem_order = sem_open(SEM_ORDER,O_CREAT,SEM_FLAGS,0);
    a_full = sem_open(A_FULL,O_CREAT,SEM_FLAGS,0);
    b_full = sem_open(B_FULL,O_CREAT,SEM_FLAGS,0);
    a_empty = sem_open(A_EMPTY,O_CREAT,SEM_FLAGS,1);
    b_empty = sem_open(B_EMPTY,O_CREAT,SEM_FLAGS,1);

    //开始创建共享内存
    shm_id = shmget((key_t)SHM_KEY, (size_t)SHM_SIZE, SHM_FLAGS); //创建共享内存
    shm_id_b = shmget((key_t)SHM_KEY_B, (size_t)SHM_SIZE, SHM_FLAGS); //创建共享内存

    child= fork();
    if(child==0){
        //子进程。消费者,从shm_struct中读取字符,将其变成大写并输出到输出文件。
        shm_struct * shm,*shm_b;

        //映射共享内存
        shm =(shm_struct*) shmat(shm_id, 0, 0);
        shm_b = (shm_struct*) shmat(shm_id_b,0,0);
        printf("\nChild memory attached at %X\n", (int)shm);

        //打开输出文件
        FILE * fp = fopen(OUT_PUT_FILE,"w");

        //等待第一次写入
        sem_wait(sem_order);

        int turn = A_TURN;
        while (shm->size |  shm_b->size){                      //两个缓冲区都没有字符则结束
            if(turn == A_TURN){                              //往A区写入
                sem_wait(a_full);
                    my_tolower(shm->buf,SHM_BUF_SIZE);
                    fputs(shm->buf,fp);
                    memset(shm,'\0',SHM_BUF_SIZE);
                    shm->size = 0;                               //每次读取完都把size重置
                    turn = B_TURN;                               //A区写满了,换B
                sem_post(a_empty);
            }else{                                              //往B区写入
                sem_wait(b_full);
                    my_tolower(shm_b->buf,SHM_BUF_SIZE);
                    fputs(shm_b->buf,fp);
                    memset(shm_b,'\0',SHM_BUF_SIZE);
                    shm_b->size = 0;
                    turn = A_TURN;                                //B区写满了,换A
                sem_post(b_empty);
            }
        }


    } else{
        //父进程。生产者。从输入文件读取字符并将其依次写入到共享内存。
        char* buffer =(char *) malloc(sizeof(char) * BUFF_SIZE + 1);
        shm_struct * shm,*shm_b;

        //打开需要处理的文件
        FILE *fp = fopen(F_NAME,"r");

        //映射共享内存
        shm = (shm_struct *)shmat(shm_id, 0, 0);
        shm_b = (shm_struct *)shmat(shm_id_b, 0, 0);
        printf("\nParent memory attached at %X\n", (int)shm);

        int turn = A_TURN,i=0;
        while (!feof(fp)) {                                 //只要文件没有读完,一直读
            if (turn == A_TURN) {
                sem_wait(a_empty);                                       //往A区写
                    while ((shm->size + BUFF_SIZE < SHM_BUF_SIZE) && !feof(fp)) {
                        fgets(buffer, BUFF_SIZE, fp);
                        my_strncpy(shm, buffer, BUFF_SIZE);
                    }
                    turn = B_TURN;                                     //A区写满了,换B
                    if (i == 0) {
                        sem_post(sem_order);
                        i = 1;
                    }
                sem_post(a_full);
            } else {                                                     //往B区写入
                sem_wait(b_empty);
                while ((shm_b->size + BUFF_SIZE < SHM_BUF_SIZE) && !feof(fp)) {
                    fgets(buffer, BUFF_SIZE, fp);
                    my_strncpy(shm_b, buffer, BUFF_SIZE);
                }
                turn = A_TURN;                                          //B区写满了,换A
                sem_post(b_full);
            }
        }
        wait(NULL);                                              //等待子进程结束

        //删除共享内存
        shmctl(shm_id,0,IPC_RMID);
        shmctl(shm_id_b,0,IPC_RMID);

        //删除信号量
        sem_unlink(SEM_ORDER);
        sem_unlink(A_EMPTY);
        sem_unlink(A_FULL);
        sem_unlink(B_EMPTY);
        sem_unlink(B_FULL);
    }
    return 0;
}


int my_strncpy(shm_struct * dest,char* source,int size) {
    int count = 0;
    while ((count < size) && (source[count]) && source[count] != EOF)
        ++count;
    strncpy(dest->buf + dest->size, source, count);
    dest->size += count;
    if(!source[count]){
        dest->buf[dest->size]='\0';
        dest->buf[dest->size+1]='\0';
    }
    return count;
}
int my_tolower(char *str,int len){
    int i = 0;
    for (; i < len && str[i] != EOF ; ++i) {
        if(str[i] >= 'a' && str[i] <= 'z') {
            str[i] += 'A' - 'a';
        }
    }
    return i;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值