系统 第五天:有名管道,共享内存

有名管道相互的信息交流

- 先读后写

#include 
#include 
#include
#include
#include
#include
#include
#include

#define FIFO_PATHNAME "myFifo"
int main()//必须写的那个和读的程序一起运行
{
    int ret = -1;
    ret = mkfifo(FIFO_PATHNAME,0777);//有名管道
    if(-1==ret)
    {
        if(EEXIST !=errno)
        {
            perror("mkfifo");
            exit(EXIT_FAILURE);
        }
    }
    printf("fifo is ok\n");
    int fd = -1;
    fd = open(FIFO_PATHNAME,O_RDWR);
    char caBuf[64]={'\0'};
    int select = 1;
    while(1)
    {
        //memset(caBuf, '\0', sizeof(caBuf));
        sleep(1);       
        if(select == 0)//先读后写
        {                           
            if(fd == -1)
            {
                    perror("mkfifo");
                    exit(EXIT_FAILURE);
            }
            char caBuf[64]={'\0'};
            ret = read(fd,caBuf,sizeof(caBuf));
            if(ret>0)
            {
                    printf("%s\n",caBuf);
                    printf("read %d bytes to fifo\n",ret);
            }
            select = 1;
        }
    ///////////////////////////////
        else if(select == 1)
        {
            if(fd == -1)
            {
                    perror("mkfifo");
                    exit(EXIT_FAILURE);
            }
            printf("请输入要说的话:\n");           
            scanf("%s",caBuf);
            ret = write(fd,caBuf,sizeof(caBuf));
            if(ret>0)
            {
                    printf("write %d bytes to fifo\n",ret);
            }
            select = 0;
        }
    }
    close(fd);
    return 0;]
}     
先写后读
#include 
#include 
#include

#include
#include
#include
#include
#include

#define FIFO_PATHNAME "myFifo"
int main()
{
    int ret = -1;
    ret = mkfifo(FIFO_PATHNAME,0777);
    if(-1==ret)
    {
        if(EEXIST !=errno)
        {
            perror("mkfifo");
            exit(EXIT_FAILURE);
        }
    }
    printf("fifo is ok\n");
    int fd = -1;
    fd = open(FIFO_PATHNAME,O_RDWR);
    char caBuf[64]={'\0'};
//////////////////////////
    int select=1;
    while(1)
    {   
        //memset(caBuf, '\0', sizeof(caBuf));
        sleep(1);
        
        
        if(select==0)//先写后读
        {
            
            
            if(fd == -1)
            {
                    perror("mkfifo");
                    exit(EXIT_FAILURE);
            }
            printf("请输入一段话\n");
            scanf("%s",caBuf);
            ret = write(fd,caBuf,strlen(caBuf));
            if(ret>0)
            {
                    printf("write %d bytes to fifo\n",ret);
            }
            select =1;
        }   
            /////////////////////////////////////////
        else if(select == 1)
        {
            
            
            ret = read(fd,caBuf,sizeof(caBuf));
            if(ret>0)
            {
                    printf("%s\n",caBuf);
                    printf("read %d bytes to fifo\n",ret);
            }
        
            
            select =0;
        }
    }
    close(fd);
    return 0;
}

共享内存

  • gcc shmget.c -o m
  • sudo ipce -m:编译完成后输入这个可以看到相关信息

写入

int main()
{
    int shmid = -1;
    shmid = shmget(0x1204,1024,IPC_CREAT|S_IRUSR|S_IWUSR);
    if(-1 == shmid)
    {
        perror("shmget");
        exit(EXIT_FAILURE);
    }
    printf("shmget ok:id=%d\n",shmid);

    void *pRet = NULL;
    pRet = shmat(shmid,NULL,0);//建立链接
    if((void *)-1==pRet)
    {
        perror("shmat");
        exit(EXIT_FAILURE);
    }
    char *pData ="I want to sleep:\n";
    memcpy(pRet,pData,strlen(pData));//其作用是往内存空间写入pData

    shmdt(pRet);//斩断链接

    return 0;
}

读取

int main()
{
    int shmid = -1;
    shmid = shmget(0x1204,1024,IPC_CREAT|S_IRUSR|S_IWUSR);
    if(-1 == shmid)
    {
        perror("shmget");
        exit(EXIT_FAILURE);
    }
    printf("shmget ok:id=%d\n",shmid);

    void *pRet = NULL;
    pRet = shmat(shmid,NULL,SHM_RDONLY);//建立链接
    if((void *)-1==pRet)
    {
        perror("shmat");
        exit(EXIT_FAILURE);
    }
    char caBuf[32]={'\0'};
    memset(caBuf,0,sizeof(caBuf));
    memcpy(caBuf,pRet,sizeof(caBuf));

    printf("%s\n",caBuf);
    
    struct shmid_ds shmInfo;
    shmctl(shmid,IPC_STAT,&shmInfo);
    printf("shm size =%ld\n",shmInfo.shm_segsz);
    shmdt(pRet);//斩断链接

    shmctl(shmid,IPC_RMID,NULL);//删除id
    return 0;
}

mmap映射

写入

int main()
{
    int fd = -1;
    fd = open("./test",O_RDWR);
    if(-1 == fd)
    {
        perror("open");
        exit(-1);
    }
    void *pRet = NULL;
    pRet = mmap(NULL,32, PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
    //初始化一个映射
    if((void *)-1 == pRet)
    {
        perror("mmap");
        exit(-1);
    }
    sprintf((char*)pRet,"%s %d %f","laoshaotongchi",1024,3.14);
    //把内容输入到pRet里面去,

    munmap(pRet,32);//取消映射
    return 0;
}

读出来

int main()
{
    int shmid = -1;
    shmid = shmget(0x1204,1024,IPC_CREAT|S_IRUSR|S_IWUSR);
    if(-1 == shmid)
    {
        perror("shmget");
        exit(EXIT_FAILURE);
    }
    printf("shmget ok:id=%d\n",shmid);

    void *pRet = NULL;
    pRet = shmat(shmid,NULL,SHM_RDONLY);//建立链接
    if((void *)-1==pRet)
    {
        perror("shmat");
        exit(EXIT_FAILURE);
    }
    char caBuf[32]={'\0'};
    memset(caBuf,0,sizeof(caBuf));
    memcpy(caBuf,pRet,sizeof(caBuf));

    printf("%s\n",caBuf);
    
    struct shmid_ds shmInfo;
    shmctl(shmid,IPC_STAT,&shmInfo);
    printf("shm size =%ld\n",shmInfo.shm_segsz);
    shmdt(pRet);//斩断链接

    shmctl(shmid,IPC_RMID,NULL);//删除id
    return 0;
}

信号---------------------------------------

信号alarm自杀函数

int main()
{
    alarm(5);//五秒之后程序结束
    while(1)
    {
        printf("hhhhh\n");
        sleep(1);
    }
    return 0;
}

signal:信号

int main()
{
    pid_t pid=1;
    pid =fork();
    if(pid >0)
    {
        while(1)
        {
            printf("i am father process,waitting child to kill me\n");
            sleep(1);
        }
    }
    else if(pid==0)
    {
        int i=5;
        while(1)
        {
            if(0==i)
            {
                printf("i kill father:\n"); 
                kill(getppid(),SIGKILL);
                break;
            }
            else 
            {
                printf("still has %d second to kill parent\n",i);
                sleep(1);
            }    
            i--;
        }
    }
    else if(-1==pid)
    {
        perror("fork");
        exit(-1);
    }
    return 0;
}   

信号raise:感觉和alarm有点像

int main()
{
    int i = 5;
    while(1)
    
    {
        if(0==i)
        {
            raise(SIGKILL);
        }
        printf("lllll\n");
        sleep(1);
        i--;
    }
    return 0;
}

你可能感兴趣的:(系统 第五天:有名管道,共享内存)