[toc]
进程
UNIX标准: 一个其中运行着一个或多个线程的地址空间和线程提供所需要的系统资源
- 进程结构
PID - 进程列表
是一个数据结构:把当前加载到内存中的所有进程的有关信息保存到一个表中.包含进程的PID,进程的状态,命令字符串和其他的一些ps命令输出的各类信息;- ps -ef 查看正在运行的进程,其他用户正在运行的进程,或者目前系统上运行的所有进程
- stime是迄今为止占用的cpu时间,CMD是进程运行命令;
- stat 状态分类: S 睡眠 R运行 D不可中断的睡眠(等待) T停止 Z死 N低优先级 W分页 s会话期收进程 +前台进程 l多线程进程 <高优先级
- 僵尸进程: 子进程终止时,它与父进程的关联还会保持,直到父进程也正常终止或父进程调用wait才告结束. 因此进程表中的子进程的表项不会立即释放.它的返回码还要保存起来,以备父进程调用. 这是就变成了僵尸或死进程
信号
raise :生成信号量
catch : 接受到一个信号量
- 信号的名称是在signal.h中定义的,以SIG开头. ABORT进程终止,AlRM超时警告,FPE浮点运算异常,HUP连接挂起,ILL非法指令,INT中断,KILL终止进程,PIPE向无读写进程的管道写数据,QUIT退出,SEGV无效内存访问,TERM终止,USR1用户定义的信号量1,USR2:
- 如果进程收到这些信号,但事先没有安排捕获它,进程将立即终止.
- 其他信号表: CHLD子进程已经停止或退出,CONT继续执行暂停进程,STOP停止执行,TSTP终端挂起,TTIN尝试读,TTOU尝试写
- CONT是让进程恢复并继续执行,控制作业比较好
- 使用 kill -信号量 PID 控制进程 例如: kill -INT 520 向进程PID520 发送中断相当于 ctrl+c
- killall -信号量 进程名称
信号处理
- signal(信号量,处理函数);监听信号量
- kill(pid_t pid , int sig);发送信号量
void ouch(int sig){
printf("daf");
}
// 调用
(void) signal(SIGINT, ouch);
//发送信号
kill(pid,SIGALRM);
//挂起
int pause(void);
fork()
pid_t pid=fork();
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
所以进行判断可以得出是哪个进程
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
void ding(int sig){
printf("here");
}
int main(){
pid_t pid;
printf("alarm\n");
pid=fork();
if(pid==0){ //判读是子进程就发送信号并退出
sleep(5);
kill(getppid(),SIGALRM);
exit(0);
}
// 父进程执行下面的监听和挂起
(void) signal(SIGALRM,ding);
pause();
exit(0);
}
sigaction
- sigaction(int sig,struct sigaction act , sigaction *oact);
sigaction 结构体 void() int sa_handler(处理函数) , sigset_t sa_mask(信号集),int sa_flags- sigset_t sa_mask 信号集: 用来修改进程在接受到信号时的行为,一般用函数修改
> sigaddset(sigset_t ss,int sign0);
> sigemptyset(sigset_t ss);
> sigfillset(sigset_t ss);
- sigset_t sa_mask 信号集: 用来修改进程在接受到信号时的行为,一般用函数修改
- sa_flags 用于改变信号的行为,可以为
- SA_NOCLDSTOP 子进程停止不会产生SIGCHLD信号
- SA_RESETHAND 对此信号的处理方式在信号处理入口重置为SIG_DFL
- SA_RESTART 重启可中断的函数而不是给出EINTR错误
- SA_NODEFER 捕获到信号时不将他添加到信号屏蔽字中
struct sigaction act;
act.sa_handler = outHanShu;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT,&act,0);
发表回复