Linux高性能服务器编程(笔记4)

         kill(pid_t pid,int sig)//一个进程给其它进程pid发送信号sig(0不发送任何信号)
         当程序处于阻塞状态的系统调用时接收到信号并且为该信号设置了信号处理函数默认情况下阻塞的系统调用将被中断且置errno为EINTR。可以通过sigaction为信号设置SA_RESTART标志以自动重启被该信号中断的系统调用。对于默认行为是暂停的信号如果没有重新设置信号处理函数则直接中断系统调用
         信号安装signal和sigaction,区别是sigaction安装的信号都能传递信息给信号处理函数
信号集sigset_t
         进程信号掩码:被屏蔽的信号不能被进程接收成为被挂起的信号(若取消被挂起的信号的屏蔽那么信号能立即被进程接收到),sigprocmask(how,_set,_oset)设置和产看信号掩码,若_set不为NULL并且how恰当指定则可以修改信号掩码集合,_oset不为NULL则返回旧的信号掩码集合(查看)
         sigpending(set)//获取进程当前被挂起的信号集(注意多次同一信号挂起只算一次,再次激活该信号处理也只处理一次),以进程线程为单位处理信号和信号掩码,不能期待父子进程主线程之间有完全相同的信号特征,例如fork后子进程继承父进程的信号掩码但是子进程的挂起信号集却为空
统一事件源:将信号也作为一种IO来处理叫做统一事件源,信号处理函数将信号写入管道一端,主线程通过IO复用监听管道读端接收信号
         SIGUP:当挂起进程的控制终端时该信号被触发,若是后台进程没有控制终端则利用SIGHUP信号来强制服务器重读配置文件(xinetd超级服务)
         strace命令能跟踪程序执行时执行的系统调用和信号,strace -p pid_number
         SIGPIPE:当读端关闭的管道或socket连接中写数据将产生该信号,默认行为是结束进程。但是有时候并不需要这样过激的结束,可以使用send的     MSG_NOSIGNAL标志禁止写操作触发SIGPIPE信号这种情况下通过send返回的errno(EPIPE)判断读端是否关闭。也可以使用IO复用检测管道和socket读端是否已经关闭,如poll会触发POLLHUP(管道)POLLRDHUP(socket)事件
         SIGURG:内核通知应用程序带外数据的信号。带外数据只有1B,recv和send带外数据标志MSG_OOB,可以通过带外标记函数sockatmark(sockfd)判断socket上的下一个数据是否有带外数据(阻塞系统调用?若下一个数据没有达到?)若已知下一个数据含有带外数据则可以采用含有MSG_OOB标志的recv接收带外数据。采用含MSG_OOB标志的recv是接收带外数据的一种方式,另外还有通过IO复用比如select的带外数据是异常事件,也可以通过SIGURG信号处理函数接收带外数据(实质还是recv,注意进程必须要拥有该socket为前提条件)
         fork相当于复制当前进程子进程属性很多和父进程相同但是信号位图被清除(原进程设置的信号处理函数不再对进程起作用),子进程和父进程代码完全相同同时还会复制父进程数据,采用写时复制(到子进程真正对数据晋城了写操作时才会复制)故尽量避免数据复制
exec子进程会替换当前进程镜像(代码和数据)但是关闭原程序打开的文件描述符
         僵尸进程:在子进程结束等待父进程读取其退出状态和父进程终止子进程仍在运行称为僵尸态,该状态子进程持有内核资源
         wait函数可以获取子进程退出的状态;waitpid中options选项设置为WHOHANG时waitpid立即返回若此时子进程仍在运行则返回0,若子进程结束则返回子进程pid,失败返回-1(非阻塞),当父进程收到SIGCHLD信号时在信号处理函数中调用waitpid彻底结束子进程(事件已经发生的情况下执行非阻塞系统调用才能提高程序的执行效率)
         管道是父子进程间通信的常用手段,父子进程必须一个关闭fd[0]一个关闭fd[1],socketpair是全双工管道
         信号量保护临界区(对共享资源访问的代码),P操作申请信号量,V操作释放信号量,semget创建或获取信号量,semop改变信号量即PV操作,semctl对信号量进行控制
         ulimit -n查看用户的描述符限制  ulimit -SHn number将用户描述符限制在number
         gdb中通过attach pid将某个子进程添加到当前调试进程中,使用set follow-fork-mode parent/child在fork前设置调试父进程或子进程
         线程调试:info threads显示当前可调试的所有进程,thread ID调试指定ID的线程,set scheduler-locking[off|on|step]其中off指所有线程继续执行on只能当前被调试的线程被执行step单步调试的时候只有当前进程会执行
         压力测试程序实现方式:IO复用、多线程、多进程,其中IO复用压力程度最高因为多进程线程要切换CPU等


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值