进程的控制

来源:互联网 发布: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**//保留成员

}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 睡久了后脑勺疼怎么办 腮帮肿了但不疼怎么办 吃硬东西腮帮痛怎么办 嘴巴长开旁边疼怎么办 晚上腿酸睡不着觉怎么办 吃酸的牙齿酸软怎么办 吃酸东西牙齿酸怎么办 拔完智齿神经疼怎么办 22岁腿关节疼痛怎么办 耳洞里面有硬块怎么办 耳洞发炎有硬块怎么办 小孩慢性扁桃体发炎怎么办大全 侧切伤口化脓了怎么办 狗狗伤口不愈合怎么办 狗后腿烂了化脓怎么办 乳腺增生腋下淋巴结肿大怎么办 手术刀口冒脓了怎么办 脚伤口感染肿了怎么办 皮外伤口不愈合怎么办 烫伤新皮红红的怎么办 脸上痘痘化脓了怎么办 痘痘引起的红肿怎么办 痘痘引起的硬块怎么办 痘痘化脓感染了怎么办 烫伤有脓了烂掉怎么办 烫伤起泡破皮了怎么办 一出汗就有狐臭怎么办 耳朵后面臭臭的怎么办 赤黑abo意外怀孕怎么办 qq忘记密保了怎么办 三星s8耗电太快怎么办 360云盘关闭照片怎么办 360云盘停止服务怎么办 房间湿度90%太高怎么办 天刀掠夺进错了怎么办 狗耳朵臭怎么办黄垢 狗耳朵里有味道怎么办 电视没了泰捷怎么办 配资公司跑路怎么办 口袋忍者倒闭了怎么办 小樱死了,佐助怎么办