1.进程:
1.1查看进程:
ps -ef/pstree/ps aux/top
1.2进程与程序的区别:
程序是静态的,是存储在磁盘上的一些指令的有序集合
进程是动态的,是程序运行的过程
1.3进程分类:
交互式进程:可以在前台运行,也可以在后台运行
批处理进程:不用和用户进行交互,一般在后台运行
守护进程:一直在后台运行,和终端没有关联,系统启动时开始执行,系统关闭时结束
1.4进程的状态:
运行态:R 进程当前正在运行
等待态:可中断等待态/S ,不可中断等待态/D
停止态:T 进程的执行被暂停
死亡态:X 最终的状态
僵尸态:Z 这是一个错误,由子进程退出父进程没有回收子进程资源造成
1.5创建进程
fork()/vfork()
fork():子进程拷贝父进程的代码段,数据段。vfrok()子进程和父进程共享数据段
fork():子进程父进程的执行顺序不定,vfork()保证子进程先执行,且只有当用exit()和_exit()使子进程退出后父进程才会执行
1.6进程退出
exit()和_exit()都可以使进程退出,但使用exit()可以正常打印程序的运行结果(自带清理缓冲区),_exit()不能正常打印,要借助其他可以刷新缓冲区的函数一起使用
1.7创建守护进程
1.7.1创建子进程,父进程退出 fork() exit();
1.7.2设置新会话 setsid();
1.7.3设置工作目录 chdir("\tmp");
1.7.4重设文件掩码 umask();
1.7.5关闭子进程从父进程继承的文件描述符 getdtablesize
1.7.6周期性的执行
2.线程
2.1线程是轻量级的进程
2.2创建线程:pthread_create() 等待子线程的退出:pthread_join()
2.3线程中需要解决的问题:
2.3.1互斥:多线程不能同时访问临界资源
需要用到互斥锁:1.初始化互斥锁 pthread_mutex_init(); 2.申请互斥锁pthread_mutex_lock()
3.关闭互斥锁 pthread_mutex_unlock(); 4.销毁互斥锁pthread_mutex_destroy();
2.3.2同步:多线程在访问临界资源时,按一定顺序来访问
信号量:有名信号 多进程间
无名信号 多线程间
信号灯集 多进程间
初始化信号量:sem_init(); sem_wait();(P操作) sem_post();(V操作)
3.无名管道:
创建无名管道:pipe(int fd[2]) fd[1]是固定读端,fd[1]是固定写段 是一个半双工的通信方式
写无名管道时要确保读端存在,不然会出现管道断裂的问题
4.有名管道:
创建有名管道:mkfifo();通过read/write实现对有名管道的读写