标准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由于是使用文件流指针,所以只能打开普通文件
文件IO
read ->读取文件描述符中的内容(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套接字