2024/4/19作业

shmry1.c

#include <code.h>

int main(int argc, const char *argv[])
{
    key_t key = ftok("./",'a');
    if(key<0)
    {
        perror("ftok");
        return -1;
    }

    int shmid = shmget(key , 128,IPC_CREAT|0664);
    if(shmid<0)
    {
        perror("shmget");
        return -1;
    }
    int semid = semget(key,2,IPC_CREAT|0664);
    if(semid<0){
        perror("semget");
        return -1;
    }

    void *shmaddr = shmat(shmid,NULL,0);
    if(shmaddr == (void *)-1)
    {
        perror("shmat");
        return -1;
    }
    printf("shmaddr = %p\n",shmaddr);

    char *ptr = (char *)shmaddr;
    strcpy(ptr,"1234567");

    struct sembuf sops[2];
    sops[0].sem_num = 0;
    sops[0].sem_op = 0;
    sops[0].sem_flg = 0;
    if(semop(semid,&(sops[0]),1)<0)
    {                                                                                                                                  
        perror("semop");
        return -1;
    }
    while(1)
    {
        sops[0].sem_op = -1;
        if(semop(semid,&(sops[0]),1)<0)
        {
            perror("semop");
            return -1;
        }
        printf("%s\n",ptr);
        sleep(1);
        sops[1].sem_flg = 0;
        sops[1].sem_num = 1;
        sops[1].sem_op = 1;
        if(semop(semid,&(sops[1]),1)<0)
        {
            perror("semop");
            return -1;
        }
    }
    shmdt(shmaddr);
    shmctl(shmid,IPC_RMID,NULL);
    return 0;
}
                                                                                                                                       
                                                                                                                                       
                                                                                                                                       
                                                                                                                                       

shmry2.c

#include <code.h>

int main(int argc, const char *argv[])
{
    key_t key = ftok("./",'a');
    if(key<0)
    {
        perror("ftok");
        return -1;
    }
    printf("key = %#x\n",key);
    int semid = semget(key,2,IPC_CREAT|0664);
    if(semid<0){
        perror("semget");
        return -1;
    }

    int shmid = shmget(key , 128,IPC_CREAT|0664);
    if(shmid<0)
    {
        perror("shmget");
        return -1;
    }

    void *shmaddr = shmat(shmid,NULL,0);
    if(shmaddr == (void *)-1)
    {
        perror("shmat");
        return -1;
    }
    printf("shmaddr = %p\n",shmaddr);
    char *ptr = (char *)shmaddr;
    size_t size = strlen(ptr);
    struct sembuf sops[2];
    sops[0].sem_num = 0;
    sops[0].sem_op = 1;
    sops[0].sem_flg = 0;
    if(semop(semid,&(sops[0]),1)<0)
    {                                                                                                                                  
        perror("semop");
        return -1;
    }
    while(1)
    {
        sops[1].sem_num = 1;
        sops[1].sem_op = -1;
        sops[1].sem_flg = 0;
        if(semop(semid,&(sops[1]),1)<0)
        {
            perror("semop");
            return -1;
        }


        for(int i=0;i<size/2;i++){
            ptr[i] = ptr[i]^ptr[size-i-1];
            ptr[size-i-1] =  ptr[i]^ptr[size-i-1];
            ptr[i] =  ptr[i]^ptr[size-i-1];
        }
        sleep(1);
        printf("倒置成功\n");
        sops[0].sem_num = 0;
        sops[0].sem_op = 1;
        sops[0].sem_flg = 0;
        if(semop(semid,&(sops[0]),1)<0)
        {
            perror("semop");
            return -1;
        }
    }

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

                                                                                                    
                                                                                                    

运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值