| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> IO-总结 -> 正文阅读 |
|
[C++知识库]IO-总结 |
? 标准IO函数?ftell? ->获取流指针当前的位置 freopen ->重定向流指针 fopen? ->打开流指针 fgets? ->从流指针中获得字符串(char *buf,int size,FILE*) fputs? ->向流指针中写入字符串(char *buf,int size,FILE *) fclose? ->关闭流指针 fprintf? ->printf的流指针升级版,向流指针中输入固定格式的字符串 rewink? ->定位到开头 fgetc? ->(FILE*)从流指针中获得一个字符 fputc? ->(int ch,FILE*)向流指针中写入一个字符 fseek? ->流指针偏移 fread ->读取文件(char* buf,int one_size,int count,FILE*)one_size是读取一个数据所需要的字节 fwrite ->写入文件(类似fread) 文件IO和标准IO的区别?文件IO的兼容性比标准IO好,因为文件IO是基于POSIX,标准IO是基于C库,所以文件IO更兼容 文件IO没有缓存机制,所以系统开销比标准IO大 文件IO可以打开其他格式的文件,而标准IO由于是使用文件流指针,所以只能打开普通文件 文件IOread ->读取文件描述符中的内容(fd,buf,size) write->(fd,buf,size) open->(const char*PATH,O_CREATE|O_WRONLY|O_RDWR) close->关闭文件描述符 lseek->(fd,int seek,SEEK_SET:开头位置? SEEK_CUR:当前位置? SEEK_END:结尾位置) stat(const char*PATH,struct stat*)将该路径的文件属性保存到stat结构体中 静态库和动态库的区别?静态库是把库放到文件中,会增加代码的体积,但是好处是运行速度快,不需要依赖库,移植性好,静态库升级之后需要重新编译 动态库是把库放到内存中,不同的应用程序调同一个库,只需要一份库文件,并且便于升级,升级后不需要再次编译,代码体积小,但是依赖库,运行速度慢。 进程命令?ps -aux? 查看进程 ps -ef 查看父进程pid ps -ajx 查看进程组 会话组pid kill?? -9 杀死进程 nice? 指定进程优先级 top? 动态显示进程信息 bg 放入后台运行 fg 前台运行 fork创建进程的特点?用fork函数创建一个子进程,并返回pid,pid=0的是子进程,>0的是父进程,并且在创建的时候会复制fork 之前的代码,只复制不运行,创建子进程之后,子父进程相互独立,都有0~4G虚拟内存空间,如果父进程先退出,子进程会成为孤儿进程,如果子进程先退出,需要父进程收回子进程的资源,否则会变成僵尸进程。 创建守护进程的流程?1.创建一个进程,让父进程退出,目的是让子进程成为孤儿进程 2.让子进程成为会话组组长,脱离用户态、setsid(); 3.修改路径为根目录 4.修改权限掩码 5.关闭文件描述符 ?写时拷贝?写时拷贝是因为进程复制开销太大而发明的一项技术,它允许父子进程可以访问同一片物理地址,当有内存发生改变的时候才进行拷贝,大大减少系统开销 ?线程的特点1.线程不稳定,一个线程崩溃会将其他线程也带崩溃 2.线程通信方便,所有线程公用一片内存空间,可以用全局变量进行通信 3.线程之间不是相互独立的,而是公用一片空间。 ?进程和线程的区别1.进程的安全性比线程要好,因为每个进程都使用独立的0-4G虚拟内存空间,而线程之间是共用一片内存空间,一个崩溃会导致其他的崩溃 2.进程之间通信困难,线程之间通信简单,进程之间相互独立,所以只能用管道,共享内存,消息队列等进行通信,而线程之间由于共用一片内存空间,所以只需要全局变量就可以通信 线程的创建流程1.先创建线程函数thread(),这里执行的是线程要做的事情 ??? pthread_exit()退出线程 2.pthread_t tid;? 创建线程变量 ? pthread_create(&tid,NULL,thread,NULL);创建线程 ??? pthread_join(tid)阻塞等待回收线程资源 同步和互斥?1.同步和互斥都是多线程过程中资源竞争的一种解决方式,同步是按顺序执行多任务,可以有很多资源量,而互斥就是资源量只有1,谁抢到就是谁的 2.同步的实现方式: ??? 同步可以用信号量来实现,具体步骤如下: ??? a.定义全局变量sem_t sem1,sem2 ??? b.sem_init(sem_t* sem,int pshared,int value); ??? @para1:信号量变量 ?????? @para2:0->线程之间使用? >0->进程间使用 ?????? @para3:信号量初值 ??? c.sem_wait(sem_t *sem); ????????????? |代码段 ??? d.sem_post(sem_t *sem); 3.互斥的实现方式 ? 跟同步类似 ? a.pthread_mutex_t? mutex?? //创建互斥锁变量 ?b.pthread_mutex_init(&mutex,NULL);? //初始化互斥锁 ? c.pthread_mutex_lock(&mutex);? //上锁 ? d.pthread_mutex_unlock(&mutex);?? //归还锁 ? e.pthread_mutex_destroy(&mutex);? //销毁锁 ? 互斥锁如何实现同步机制? 互斥锁配合条件变量可以实现同步机制 a.初始化条件变量 int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr); b.等待信号发生 int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex); c.给条件变量发送信号 int pthread_cond_signal(pthread_cond_t *cond); ?死锁--死锁产生的条件死锁一般有四个产生条件 1.互斥条件 2.请求与保持条件 3.不可剥夺条件 4.循环等待条件:很多进程形成首尾相接循环等待的情况 死锁--如何避免死锁死锁的四个条件除了 互斥条件无法改变,改变其余三个任意一个即可 1.破坏请求与保持条件:只需要保证在请求资源的时候不能保持资源即可或者静态分配在程序开始的时候把需要的资源全部分配完成 2.破坏不可剥夺条件:可以让一个进程当一段时间无法获得请求的资源的时候隐式释放保持的资源 3.破坏循环等待条件:按照资源稀缺程度更合理的分配序号 ?进程间的通信方式1.基本的通信方式: 有名管道 无名管道? 信号 2.ipc对象 共享内存 消息队列 信号灯集 3.BSD socket套接字 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 8:05:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |