进程的控制
来源:互联网 发布:js 小于或等于 编辑:程序博客网 时间:2024/06/10 16:42
一.进程的基本控制
1.进程的常见控制函数(进程同步)
1.1为什么需要控制进程
控制进程运行顺序等。
1.2.pause/sleep/usleep
1.3.atexit/on_exit回调函数
2.进程与文件锁
在多进程下文件读写是共享的
文件锁标识一个文件正在被进程读写(建议锁)
API:fcnt1(文件锁受内核参数影响)
编程技巧:对文件加锁,判定一个文件是否存在锁
int fcntl(
int fd,//被加锁的文件描述符号
int cmd,//锁的操作方式:F_SETLK(已经是加过锁,则返回异常) F_UNLKF_SETLKW(已经加锁,则阻塞等待,直到解锁为止)
struct flock*lk);//锁的描述
返回值:
0:加锁成功
1:加锁失败
案例:写二个程序A加锁B获取锁的信息
对同一文件多次加锁,加多个锁。锁也是一个进程可以共享的信息。
二.信号
1.信号的作用
背景:进程之间通信比较麻烦,但进程之间必须通信。如父子进程之间。子进程结束的时候必须通知父进程。
作用:通知其它进程响应。进程之间通信机制。接受的信号的进程会马上停止,然后调用执行信号处理函数,处理完以后返回(软中断)。
信号处理函数:默认处理函数与用户处理函数。
默认处理函数:打印信号信息,退出进程。
用户处理函数:用户将信号处理函数注册到操作系统
2.信号的发送与安装
向指定进程发送信号:kill -s信号 进程ID或kill -信号 进程ID
信号:数字1-31 32-64 宏:kill-l查看所有信号
ctrl+d 就是发送信号2 SIGINT(中断信号)
信号安装使用void (*signal(int signum,void(* handler)(int)))(int)。
信号SIGKILL SIGSTOP不能被处理,绑定无效。
发送信号 int kill(pid_t pid,ints)
进程ID:
>0 发送信号到指定进程
=0 发送信号到该进程组中的所有进程
=-1 发送给所有有权限的进程(除init)
<0 发送给指定的进程组,组ID=绝对值
3.信号的应用
3.1延时器timeout
SIGALARM
信号发出函数:alarm(unsigned int)参数秒后向本进程发送SIGALARM信号
3.2定时器
int settimer(intwhich,//计时方式ITIMER_REAL,ITIMER_VIRTUAL/ITIMER_PROF
const struct itimerval*val,//定时器的时间参数
struct itimer *oldval);//返回原来设置的定时器参数,如果为NULL,则不返回
)
struct itimerval
{
struct timeval it_interval;//间隔时间
struct timeval it_vaue;//延时时间
}
struct timeval
{
long tv_sec;
long tv_usec;
}
信号应用:
系统与应用程序之间
应用与应用程序之间
父子进程之间
sleep与pause函数被信号影响后,sleep与pause状态终止。
4.信号的可靠与不可靠,以及信号的含义
信号有丢失(信号压缩),由于历史的缘故。由此引出,可靠信号(实时信号)与不可靠信号(非实时信号)。
早期信号1-31 31个信号,不可靠信号(与系统有关)
后期信号34-64 31个信号,可靠信号(用户信号)
5.信号的操作
信号导致的问题,程序被意外的信号干扰。
5.1.信号屏蔽 intsigprocmask(int how,//SIG_BLOCK,SIG_UNBLOCK,SIG_SETMASK
const sigset_t *sigs,//操作的信号集合
sigset_t *oldsigs//返回原来的操作的信号)
屏蔽过程:声明信号集合sigset_t,
加入屏蔽信号,有一组信号集合维护函数
清空集合sigemptyset
添加信号到集合sigaddset
从集合删除信号sigdelset系列函数
添加所有信号到集合sigfillset
判定信号是否在集合sigismember
屏蔽信号
接触屏蔽
5.2.信号屏蔽的切换
int sigsuspend(sigset_t *sigs); 屏蔽新的信号,原来的信号失效.
sigsuspend是阻塞函数.对参数信号屏蔽。对参数没有没有指定的信号不屏蔽,但当没有屏蔽的信号处理函数调用完毕sigsuspend返回
sigsuspend返回条件:
1.信号发生,并且信号是非屏蔽信号
2.信号必须要处理,而且处理函数返回后,sigsuspend才返回
sigsuspend设置新的屏蔽信号,保存旧的屏蔽信号(开放原来信号,使用新的屏蔽信号),而且当sigsuspend返回的时候,自己会恢复旧的屏蔽信号
可把中断限制在固定区域处理,防止了中断中不可控
sigsuspend=pause+指定屏蔽的信号
pause与sigsuspend都会被信号干扰(中断),中断的是pauseg与sigsuspend函数(内部),而不是进程中的其它代码。
sigsuspend使原来的屏蔽信号失效,当sigsuspend返回后恢复原来的屏蔽信号
5.3.查询被屏蔽的信号
查询正在屏蔽的信号int sigpending(sigset_t*sets)
6.信号与数据传递
sigqueue/sigaction
信号函数调用中只屏蔽本身的信号,不屏蔽其他信号
保证函数信号调用中屏蔽指定的信号:sigaction可能指定处理函数调用的屏蔽信号
sigaction在处理信号的时候,可以接受数据
sigqueue发送信号的时候,可以发送数据
sigaction/sigqueue是signal/kill的增强版本,sigaction/sigqueue稳定
int sigaction(// 返回0表示成功,-1失败
int sig,//被处理的信号
const structsigation*action,//处理函数
struct sigaction*oldact//返回原来的处理函数)
struct sigaction
{
void (*sa_handle)(int);
void(*sa_sigaction)(int,siginfo_t*,void*);
sigset_t *mask;//屏蔽信号
int flags;//SA_SIGINFO
void**//保留成员
}
- 进程的控制[原创]
- Linux的进程控制
- 进程的控制
- 进程控制的函数
- 进程的控制
- scala的进程控制
- linux 进程的控制
- 进程的控制
- os -- 进程的控制
- Linux的进程控制
- 进程的基本控制
- 进程_控制进程的资源使用
- 进程的基本概念和进程控制
- Linux下的进程控制
- 进程的控制(实验2)
- 进程的控制(实验2)
- Windows编程-进程的控制
- 进程控制的相关知识
- 最长递增子序列的应用
- 小鑫の日常系列故事(七)——小纸条
- 集群监控工具ganglia
- 程序猿找工作必练内功:排序算法大总结(三)——堆排序算法
- C#学习4
- 进程的控制
- 通用makefile是如何炼成的(VIII)
- ego 代码所学
- 使用wscript.exe实现kill某个进程,用户无任何感知,不会弹出任何命令的执行窗口
- Android - 文件读写操作 总结
- newInstance() 的参数版本与无参数版本详解
- java.lang.Class.getConstructor(Class[] parameterTypes)
- java实现文件上传下载
- 为什么VC经常输出烫烫烫烫烫烫烫烫(内存在不同状态下默认填充的字符)