一 .进程
1.进程是什么
1.进程是程序的一次动态执行过程
2.进程是程序执行和资源管理的最小单位
2.进程的特点
每一个进程都有一个0-4g 的虚拟内存
3.查看进程
ps axj
ps aux
pstree
top
4.进程
二.进程的类型
1.交互进程 :可以在前台运行,也可以在后台运行
2.批处理进程 :不属于终端,在队列中顺序执行
3.守护进程 :在后台运行,在系统开启时运行,系统关闭结束
三.进程的运行状态
1.运行态:
2.等待态
3.停止态
4.僵尸态
5.死亡态
四.相关的系统调用
1.创建进程:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
2.改变进程优先级:
nice
-按用户指定的优先级运行进程
renice
-改变正在运行进程的优先级
3.获取当前的进程号
#include <sys/types.h>
#include <unistd.h>
getpid(); 获取子进程
getppid(); 获取父进程
4.进程退出
#include <stdlib.h> (exit所需的)
#include <unistd.h> (_exit所需的)
exit(int status); 会刷新缓冲区
_exit(int status); 不会刷新
5.进程回收
#include<sys/types.h>
#include<sys/wait.h>
(阻塞)
wait(int * status); 参数:进程退出时的状态
#include<sys/types.h>
#include<sys/wait.h>
(阻塞或非阻塞)
waitpid(pid_t pid,int *status,int options);
参数:1:-1 等待任何一个子进程退出
2:参数退出时的状态
3:一般WNOHANG
6.exec函数族
五.守护进程
1.守护进程特点:
1)系统开启时开始运行,系统关闭时结束运行
2)后台进程,与终端无关
2.守护进程的创建步骤:
1.创建进程,父进程退出
2.创建新的会话
3.改变当前目录为根目录
4.改变文件的权限掩码
5.关闭文件描述符
六.进程的通信
1.无名管道
创建无名管道:
#include<unistd.h>
int pipe(int fd[2]);
2.有名管道
创建有名管道:
#include <unistd.h>
#include <fcntl.h>
#include <sys/types>
mkfifo(const char * filename,mode_t mode);
参数:1.要创建的管道
2.权限
3.信号:
信号安装函数:
#include <signal.h>
void( *signal(int signum,void(*handler)(int))) (int);
参数: 1.signum 指定的信号
2.handler:
SIG_IGN :忽略该信号
SIG_DEL:采用系统默认的方式处理信号
自定义的信号处理函数指针
alarm闹钟函数
#include<unistd.h>
int alarm(unsigned int seconds); 参数:秒数
pause挂起函数;
#include <unistd.h>
int pause(void);
kill 发送信号
#include <signal.h>
#include <sys/types.h>
int kill(pid_t ,int sig); 函数参数:1.进程号 2. 信号
raise 给进程自己发信号
#include <signal.h>
#include <sys/types.h>
int raise(int sig);
七.共享内存
1.创建/打开共享内存
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
key_t key=ftok(".",23);
shmget(key_t key,int size,int shmflg);
获取的是共享内存标识符
函数参数:1.ftok的返回值
2.共享内存区的大小
3.权限
2.映射共享内存
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
shmat(int shmid,const void * shmaddr,int shmflg);
参数:1. 要映射的共享区内存标识符
2.将共享内存映射到指定地址,NULL 系统自动完成映射
3. 默认0 可读写
3.撤销共享内存的映射
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
shmdt(const void * shmaddr);参数:共享内存映射后的地址
4.删除共享内存对象
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
shmctl(int shmid,int cmd,struct shmid_ds *buf);
参数:1.要操作的共享标识符
2.IPC_STAT 获取对象属性
IPC_SET 设置对象属性
IPC_RMID 删除对象
3.指定IPC_STAT/IPC_SET时可以用以保存/设置属性
八.有名信号量
1.创建有名信号量:
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
sem_open(const cahr *name,int oflag);
sem_open(const char *name,int oflag,mdoe_t mode,unsigned int value);
函数参数:1.信号量的名字
2.打开的标志,O_RDWR ,O_CREAT传入这个,才会有后两个参数
3.权限 0666
4.信号量初值
sem_wait();p操作 -1
sem post();v操作 +1
2.关闭信号量
#include <semaphore.h>
sem_close(sem_t *sem);
参数 :信号量的地址
九.消息队列
1.创建消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
msgget(key_t key,int flag);
函数参数:1.key值
2.访问权限
2.添加消息
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
msgsnd(int msqid,const void *msgp,size_t size,int flag);
函数参数:1.消息队列的ID
2.指向消息的指针
3.发送消息的正文字节数
4. 0:直到发送完成函数才返回 IPC_NOWAIT消息没有发送完成函数也会立即返回
3.接受消息:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
msgrcv(int msgid,void * msgp,size_t size,long msgtype,int flag);
函数参数:1.消息队列的ID
2.接受消息的缓存区
3.接受消息的字节数
4. 0:要接收消息队列中的第一个消息
大于0:接收消息队列中第一个类型为msgtyp的消息
5.0:若无消息函数会一直阻塞
IPC_NOWAIT:若没有消息,进程会立即返回
4.删除消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
msgctl(int msgqid,int cmd,struct msqid_ds *buf);
函数参数:1.消息队列的ID
2.IPC_STAT: 读取消息队列的属性,并将其保存
IPC_SET: 设置消息队列的属性
IPC_RMID:从消息队列中删除消息队列
3.消息队列缓存区
十.线程
1.创建线程
#include <pthread.h>
pthread_creat(pthread_t*thread,const pthread_attr_t *attr,void *(*routine)(void*),void*arg)
参数:1.创建的线程
2.指定线程的属性,NULL表示缺省属性
3.线程执行的函数
4.传递给线程执行的函数的参数
2.线程的等待函数
#include <pthread.h>
prhread_join(pthread_t thread,void **value_ptr);
函数参数:1.要等待的指针
2.指针指向线程返回的参数
3.将子线程设置成游离态
#include <pthread.h>
pthread_detach(pthread_t,thread);
4.线程退出函数
#include <pthread.h>
pthread_exit(void *value_ptr)
函数参数:线程退出时返回的值
11.同步
1.初始化:
#include <semaphore.h>
sem_init(sem_t*sem,int pshared,unsigned int int value)
函数参数:1.初始化的信号量
2.信号量共享的范围 0线程间使用,非0:进程间的使用)
3.信号量初值
2.操作
#include <semaphore.h>
sem_wait(sem_t*sem); p操作 信号量-1
sem_post(sem_t*sem); v操作 信号量+1