当前位置: 首页 > article >正文

IO进程线程复习

文件IO和标准IO的区别

文件IO:

        1.系统提供的用于输入输出的函数

        2.有文件描述符0,1,2

        3.open,close,puts,gets

        4.可以操作任意类型的文件,不能操作目录

        5.无缓存机制

标准IO:

        1.C库提供的用于输入输出的函数

        2.有文件流,stdin,stdout,stderr

        3.fopen,fclose,fputs,fgets

        4.只能操作普通文件和其他部分类型文件

        5.有缓存机制

进程有哪五态

        创建态 就绪态 运行态 消亡态 阻塞态

什么时候刷新缓存区

        换行、缓冲区溢出、输入输出切换、缓冲区刷新函数fflush、程序结束、关闭标准输入流标准输出流指针

行缓存和全缓存的区别

        全缓存换行不会刷新缓冲区

进程模板

int main()
{
    pid_t pid=fork();
    if(pid>0)//父进程
    {
        
    }
    else if(pid==0)//子进程
    {




    }
    else
    {
        perror("fork");
    }

    return 0;

}

如何实现同步

        无名信号、互斥锁+条件变量

如何实现异步通讯

        管道,消息队列,共享内存,信号灯集,套接字,信号

消费者模型(参考写法不唯一)

pthread_mutex_t mt1;
pthread_cond_t cond1;
int n=0;

void* producer(void* arg)
{
    
    for(int i=0;i<5;i++)
    {
        pthread_mutex_lock(&mt1);
        printf("生产了一台特斯拉%d\n",n);
        n++;
        pthread_cond_signal(&cond1);
        pthread_mutex_unlock(&mt1);
        sleep(5);
    }

}
void* consumer(void* arg)
{
    pthread_mutex_lock(&mt1);
    pthread_cond_wait(&cond1,&mt1);   
    printf("购买了一台特斯拉\n");
    sleep(10);
    pthread_mutex_unlock(&mt1);

}

int main()
{   
    pthread_mutex_init(&mt1,NULL);
    pthread_cond_init(&cond1,NULL);
    pthread_t ti;
    pthread_t tid[5];
    ti=pthread_create(&ti,NULL,producer,NULL);
    if(ti!=0)
    {
        perror("pthread_create");
        return -1;
    }
    for(int i=0;i<5;i++)
    {
        tid[i]=pthread_create(&tid[i],NULL,consumer,NULL);
        if(tid[i]!=0)
        {
            perror("pthread_create");
            return -1;
        }
    }

    pthread_join(ti,NULL);
    for(int i=0;i<5;i++)
    {
        pthread_join(tid[i],NULL);
    }

    pthread_mutex_destroy(&mt1);
    pthread_cond_destroy(&cond1);
    return 0;
}

消息队列

//发送
typedef struct
{
    long type;
    char text[248];
}msg;

int main(argc,argv[])
{
    if(argc!=2)
    {
        return -1;
    }
    int type=atoi(argv[1]);
    key_t key=ftok("./ipc",1);
    int id=msgget(id,IPC_CREAT|0666);

    while(1)
    {
        msg buff={0};
        scanf("%247s",&buff.text);
        while(getchar()!=10);       
        msgsnd(id,&buff,strlen(buff.text),0);
    }
    return 0;
}

//接收
typedef struct
{
    long type;
    char text[248];
}msg;

int main(argc,argv[])
{
    key_t key=ftok("./ipc",1);
    int id=msgget(id,IPC_CREAT|0666);
    while(1)
    {
        msg buff={0};
        int type=-1;
        scanf("%d",&type);
        while(getchar()!=10);
        buff.type=type;
        msgrcv(id,&buff,248,type,IPC_NOWAIT|020000);
    }
    return 0;
}

共享内存

//输出
typedef struct
{
    char text[256];
}shm;
shm* addr=NULL;
int id=-1;
void handler(int sign)
{
    shmdt(addr);
    shmctl(id,IPC_RMID,NULL);
    exit(0);
}
int main()
{
    signal(SIGINT,handler);
    key_t key=ftok("./ipc",1);
    id=shmget(key,sizeof(shm),IPC_CREAT|0666);
    addr=shmat(id,NULL,0);
    while(1)
    {
        printf("%s\n",addr->text);
        memset(addr,0,sizeof(addr));
        sleep(1);
    }
    return 0;
}


//写入
typedef struct
{
    char text[256];
}shm;
shm* addr=NULL;
int id=-1;
void handler(int sign)
{
    shmdt(addr);
    shmctl(id,IPC_RMID,NULL);
    exit(0);
}
int main()
{
    signal(SIGINT,handler);//ctr+c 暂停
    key_t key=ftok("./ipc",1);
    id=shmget(key,sizeof(shm),IPC_CREAT|0666);
    addr=shmat(id,NULL,0);
    while(1)
    {
        scanf("%255s",addr->text);
        while(getchar()!=10);
        sleep(1);
    }
    return 0;
}


http://www.kler.cn/a/522013.html

相关文章:

  • 用 Scoop 优雅管理 Windows 软件:安装、配置与使用全指南
  • java——继承
  • (一)QT的简介与环境配置WIN11
  • 16、智能驾驶域控的材料回收
  • Baklib揭示内容中台与人工智能技术的创新协同效应
  • 【面试】【前端】SSR与SPA的优缺点
  • 新项目上传gitlab
  • 日志收集Day007
  • RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理
  • 一文讲解Java中的equals和hashCode方法
  • VSCode 设置为中文(Configure Display Language)
  • HarmonyOS:ForEach:循环渲染
  • HPO3:提升模型性能的高效超参数优化工具
  • 24小R的随机播放顺序
  • 使用TensorFlow实现逻辑回归:从训练到模型保存与加载
  • 信息学奥赛一本通 2110:【例5.1】素数环
  • 2025数学建模美赛|A题成品论文
  • 神经网络|(六)概率论基础知识-全概率公式
  • 爱快 IK-X9 吸顶AP 简单开箱评测和拆解,三频WiFi7,BE5000,2.5G网口
  • Continuous Batching 连续批处理
  • 基于ESP8266的多功能环境监测与反馈系统开发指南
  • 嵌入式C语言:结构体
  • KF-GINS 和 OB-GINS 的 Earth类 和 Rotation 类
  • 安卓日常问题杂谈(一)
  • Java-数据结构-二叉树习题(3)
  • 落地 基于特征的对象检测