Linux Linux程序练习五

题目:编写两个进程a和b,利用共享内存技术,a向共享内存写字符串,b将从共享内存中读到的字符串在屏幕上打印出来。
//创建共享内存区
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <errno.h>

#include <sys/ipc.h>
#include <sys/shm.h>

int main(int arg,char *args[])
{
    //创建内存共享区
    int shmid=0;
    shmid=shmget(IPC_PRIVATE,sizeof(char)*1024,0666);
    if(shmid==-1)
    {
        printf("shmget() is failed !
");
        return -1;
    }
    printf("创建共享内存区成功,共享内存区段标识符是%d
",shmid);
    return 0;
}
//向共享内存区写入数据
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/shm.h>

int main(int arg, char *args[])
{
    if (arg < 2)
    {
        printf("请输入一个参数!
");
        return -1;
    }
    int shmid = 0;
    int resid=0;
    shmid = atoi(args[1]);
    //进程附加共享内存区
    void * shmbuf = NULL;
    shmbuf = shmat(shmid, 0, 0);
    if (shmbuf == -1)
    {
        printf("进程A附加共享内存区失败! error message : %s
", strerror(errno));
        return -1;
    }
    //数据写入进程私有共享内存区
    read(STDIN_FILENO, shmbuf, sizeof(char) * 1024);
    //关闭本进程私有共享内存区
    resid=shmdt(shmbuf);
    printf("shmdt()函数返回值是%d
",resid);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//从共享内存区读数据
#include <unistd.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/shm.h>

int main(int arg, char *args[])
{
    if (arg < 2)
    {
        printf("请输入一个参数!
");
        return -1;
    }
    int shmid = 0;
    int resid = 0;
    shmid = atoi(args[1]);
    //附加到共享内存区
    void * shmbuf = NULL;
    shmbuf = shmat(shmid, 0, SHM_RDONLY);
    if (shmbuf == -1)
    {
        printf("shmat() is failed 
");
        return -1;
    }
    printf("%s", shmbuf);
    //关闭当前进程的共享内存区
    resid = shmdt(shmbuf);
    printf("shmdt()函数返回值是%d
", resid);
    return 0;
}
//关闭共享内存区
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <errno.h>

#include <sys/ipc.h>
#include <sys/shm.h>

int main(int arg,char *args[])
{
    if(arg<2)
    {
        printf("请输入一个参数!
");
        return -1;
    }
    int resid=0;
    int shmid=0;
    shmid=atoi(args[1]);
    resid=shmctl(shmid,IPC_RMID,0);
    printf("返回值是%d
",resid);
    return 0;
}
.SUFFIXES:.c .o
CC=gcc
SRCS1=createshm.c
SRCS2=wra.c
SRCS3=rdb.c
SRCS4=rmshm.c
OBJS1=$(SRCS1:.c=.o)
OBJS2=$(SRCS2:.c=.o)
OBJS3=$(SRCS3:.c=.o)
OBJS4=$(SRCS4:.c=.o)
EXEC1=firsts
EXEC2=nexts
EXEC3=lasts
EXEC4=lasts2
start:$(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4)
    $(CC) -o $(EXEC1) $(OBJS1)
    $(CC) -o $(EXEC2) $(OBJS2)
    $(CC) -o $(EXEC3) $(OBJS3)
    $(CC) -o $(EXEC4) $(OBJS4)
    @echo "^_^-----OK-----^_^"
.c.o:
    $(CC) -Wall -g -o $@ -c $<
clean:
    rm -f $(OBJS1)
    rm -f $(OBJS2)
    rm -f $(OBJS3)
    rm -f $(OBJS4)
    rm -f $(EXEC1)
    rm -f $(EXEC2)
    rm -f $(EXEC3)
    rm -f $(EXEC4)

原文地址:https://www.cnblogs.com/zhanggaofeng/p/5851095.html