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文件 基于内存 无序内存 内存共享 有序内存 共享队列
相关文章推荐
- Linux僵尸进程
- linux 下常用命令
- Linux rpm 命令参数使用详解[介绍和应用]
- 在Centos 6.3 X64平台安装11.2.0.1时,Hang到65%不动
- linux系统学习
- 两台linux服务器时间同步
- SELinux深入理解
- Linux下安装了MySQL之后,无法用navicat连接数据库?
- centos 下 KVM虚拟机的创建、管理与迁移
- Windows10连接linux服务器
- 每天一个Linux命令-20(lsb_release)
- 查找linux设备的uuid
- 查找linux设备的uuid
- Linux系统下安装配置jdk
- Linux中如何安装loadgenerator
- linux(五)
- linux(四)
- linux(三)
- Linux下UDP端口扫描
- Linux下的双网卡绑定bond0 em1 em2