您的位置:首页 > 运维架构 > Linux

linux(六)

2015-08-17 19:08 507 查看
问题解答:
1.exit(状态码)返回状态码有什么意义?
返回值被系统得到.系统根据状态码进行日志记录.
返回值被调用者得到:system/wait.程序会根据返回状态码进行对应处理。
exit(状态码)=main函数中的return 状态码;
2.状态码的第二个字节才是exit()的返回值或者return值。

一.进程的基本控制
1.进程的常见控制函数
1.1.为什么需要控制进程?
1.2.pause/sleep/usleep
1.3.atexit  on_exit
2.进程与文件锁
在多进程下文件读写是共享的
问题:
怎么知道一个文件正在被另外进程读写?
解决方案:
文件锁。(建议锁)
API:
fcntl(文件锁受内核参数影响)
编程技巧:
对文件加锁
判定一个文件是否存在锁
函数说明:
int fcntl(
int fd,//被加锁的文件描述符号
int cmd,//锁的操作方式:F_SETLK(已经加锁,异常返回) F_UNLK F_SETLKW(已经加锁,则阻塞等待)
struct flock *lk);//锁的描述

返回值:
0:加锁成功
-1:加锁失败

案例:
写两个程序:
A:加锁
B:获取锁的信息

锁也是一个进程可以共享的信息。

二.信号
1.信号的作用
背景:
进程之间通信比较麻烦。
但进程之间有必须通信,比如父子进程之间。
作用:
通知其他进程响应。进程之间通信机制.
信号:
接受信号的进程马上停止.调用信号处理函数.
信号处理函数:
默认处理函数.
打印信号信息,退出进程.
用户处理函数.
中断:
软中断.

案例:
1.进程之中,默认信号处理
2.进程之中,用户信号处理
3.中断

kill -s 信号  进程ID
kill -信号  进程ID
信号:数字1-31  34-64
宏SIGINT=2
ctrl+d 发送信号2 SIGINT
kill -l察看所有信号

信号SIGKILL SIGSTOP不能被处理.

案例:
发送信号
int kill(pid_t pid,int s)
进程ID:
>0:发送信号到指定进程
=0:发送信号到该进程所在进程组的所有进程
-1:发送给所有进程,除init外
<0:发送给指定的进程组(组ID=绝对值)
2.信号发送与安装
signal
kill
3.信号的应用
3.1.延时器timeout
SIGALRM
信号发出函数:alarm
3.2.定时器
int setitimer(int which,//计时方式
//ITIMER_REAL  / ITIMER_VIRTUAL /ITIMER_PROF
const struct itimerval *val,//定时器的时间参数
struct itimer *oldval);//返回原来设置的定时器
//如果=NULL,则不返回
struct itimerval
{
struct timeval it_interval;//间隔时间
struct timeval it_value;//延时时间
}
struct timeval
{
long tv_sec;
long tv_usec;
}
信号应用:
系统与应用程序之间
应用于应用程序之间
父子进程之间
案例1:
使用定时器信号,实现多任务.
实现:
实现7位随机数
使用中断实现时间的显示
案例2:
实现父子进程之间通信

控制进程.

sleep与pause函数被信号影响后,sleep不再继续sleep.
pause不再pause.
练习:
1.在curses显示7位随机数

其他信号函数
raise

4.信号的可靠与不可靠以及信号的含义
信号有丢失.(信号压缩)
由于历史的缘故:信号有压缩的需求.
可靠信号(实时信号)与不可靠信号(非实时信号).

早期信号 1-31 31个信号, 不可靠(与系统有关).
后期信号34-64 31个信号,可靠信号(用户信号)

5.信号的操作
信号导致的问题
1.信号屏蔽
int sigprocmask(int how,//操作方式
SIG_BLOCK
SIG_UNBLOCK
SIG_SETMASK
const sigset_t *sigs,//操作的信号集合
sigset_t *oldsigs);//返回原来操作的信号集合
1.声明信号集合
sigset_t  sigs;
2.加入屏蔽信号
一组信号集合维护函数:
2.1. 清空集合sigemptyset
2.2. 添加信号到集合sigaddset
2.3. 从集合删除信号sigdelset
2.4. 添加所有信号到集合sigfillset
2.5. 判定信号是否在集合sigismember
3.屏蔽信号
4.接触屏蔽

2.信号屏蔽的切换
int sigsuspend(sigset_t *sigs);
屏蔽新的信号,原来的信号失效.
sigsuspend是阻塞函数.对参数信号屏蔽.
对参数没有指定的信号不屏蔽,但当没有屏蔽信号处理函数调用完毕
sigsuspend返回条件:
1.信号发生,并且信号是非屏蔽信号
2.信号必须要处理,而且处理函数返回后,sigsuspend才返回.

sigsuspend设置新的屏蔽信号,保存旧的屏蔽信号
而且当sigsuspend返回的时候,恢复旧的屏蔽信号.

3.查询被屏蔽的信号
int sigpending(sigset_t *sets);
回顾:
1.进程控制sleep pause
2.理解信号的中断流程
3.发射信号(Shell/code),处理信号
4.alarm与setitimer
5.信号应用:实现简单多任务与进程之间通信
6.使用信号+sleep/pause控制进程
7.信号的屏蔽
8.了解sigpending与 sigsuspend的使用.

思考:
信号处理函数调用过程中,是否被其他信号影响.

明天:
1.信号与进程间数据传递
sigqueue=kill与sigaction=signal
2.IPC:
基于文件
无序文件:映射
有序文件:管道文件:有名/匿名
socket文件
基于内存
无序内存
内存共享
有序内存
共享队列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: