美文网首页
系统 第五天:有名管道,共享内存

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

作者: ie大博 | 来源:发表于2016-12-05 09:18 被阅读0次

有名管道相互的信息交流

- 先读后写

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

#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 <sys/types.h>
#include <sys/stat.h>
#include<fcntl.h>

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>

#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;
}

相关文章

  • linux c/c++面试知识点整理(五)

    41、linux系统进程间有哪些通信方式 管道、有名管道、消息队列、信号、共享内存、socket、文件 ...

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

    有名管道相互的信息交流 - 先读后写 先写后读 共享内存 gcc shmget.c -o m sudo ipce ...

  • 进程通信方式

    管道及有名管道信号消息队列共享内存信号量套接字

  • Instruments之Leaks

    1. 介绍 1. 进程 进程是系统资源分配的最小单位 进程结构 进程通信 pipe管道fifo有名管道内存共享映射...

  • 进程间通信的方式

    管道(pipe),流管道(s_pipe)和有名管道(FIFO) 信号(signal) 消息队列 共享内存 信号量 ...

  • 进程间通信

    声明:图片资源摘自于网络 管道(PIPE) 有名管道(FIFO) 进程1 进程2 高级管道(popen) 共享内存...

  • DBus for IPC in Qt

    Linux 系统IPC种类: 信号 管道 命名管道 信号量 消息队列 共享内存 内存映射文件 套接字 DBus 概...

  • 操作系统知识点

    操作系统 IPC 共享内存 管道 socket RPC romote procesure calls 同步机制 ...

  • 电商专业学习嵌入式软件开发第四十九天

    系统编程第五天 今天是系统编程最后一天,讲的主要是管道和共享内存以及信号量,看着老师的代码也不是很难,就是自己写有...

  • (1)进程间几种通信方式

    管道、消息队列、共享内存、信号量、信号、socket 要知道管道、消息队列、共享内存的本质:内存本质、效率以及传输...

网友评论

      本文标题:系统 第五天:有名管道,共享内存

      本文链接:https://www.haomeiwen.com/subject/jtifmttx.html