信号singal:
信号是一种软中断,在程序中每个信号用一个整数表示,为了记忆每个信号都有一个宏定义。
SIGKILL 9 进程终止信号
SIGSTOP 进程停止信号
SIGCONT 进程继续执行信号
SIGINT Ctrl+C发出信号,默认终止进程
SIGQUIT Ctrl+\发出信号,默认终止进程并产生Core文件
SIGTSTP Ctrl+Z发出信号,默认停止进程
SIGCHLD 子进程结束信号,默认忽略
SIGALRM 闹钟信号,闹钟定时时间到发出的信号,默认终止进程
自己处理信号:
typedef void (*sighandler_t)(int); //信号处理函数指针,入参是当前处理信号值
sighandler_t signal(int signum, sighandler_t handler); //使用signal登记信号处理函数,返回原来的信号处理函数指针
signal(信号,SIG_IGN) //忽略信号
signal(信号,SIG_DFL) //恢复默认信号,返回SIG_ERR表示出错
自己处理的信号只能是可以捕获的信号,SIGKILL和SIGSTOP无法捕获。
kill -信号 进程id //用于发送指定信号到指定进程。
int kill(pid_t pid, int sig); //如果pid=0表示向本组的所有进程发送信号,如果sig=0不发信号,但是检测进程id是否存在,成功返回0,失败返回-1。
int raise(int sig); //用于给本进程发信号。
信号可能打断正在阻塞中的函数,使该函数以失败返回,一般把errno设置成EINTR。
unsigned int alarm(unsigned int seconds); //设置一个alarm定时器,定时器时间到产生SIGALRM信号,返回值为定时器剩余时间。
积压的多个相同的信号可能会合并为一个。
struct itimerval {
struct timeval it_interval; /* Interval for periodic timer */ 第一次之后每次循环定时时间
struct timeval it_value; /* Time until next expiration */ 第一次定时时间
};
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);//可以设置循环定时器
int getitimer(int which, struct itimerval *curr_value);
复杂信号:
不可重入问题,使用了全局变量,静态局部变量,可能一直阻塞的函数一般是不可重入的函数。
struct passwd {
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
char *pw_gecos; /* user information */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
};
struct passwd *getpwnam(const char *name); //返回指针,指向的静态局部变量
struct passwd *getpwuid(uid_t uid); //
信号集:sigemptyset(sigset_t *) //清空信号集
sigfillset(sigset_t *) //填满信号集
sigaddset(sigset_t *, int) //添加信号
sigdelset(sigset_t *, int) //删除信号
sigismember(sigset_t *, int) //判断信号中是否有这个信号
使用信号集可以用来阻塞一组信号。
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); //SIG_BLOCK SIG_UNBLOCK SIG_SETMASK set为需要添加的信号集,oldset为就信号集
阻塞并不丢弃信号,信号来了但是没有被处理叫做未决信号。 sigpending取得处于未决状态的信号集
int sigpending(sigset_t *) //取得未决的信号集
带参数信号的处理:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); //设置信号的处理方式
struct sigaction {
void (*sa_handler)(int); //无惨信号
void (*sa_sigaction)(int, siginfo_t *, void *); //带参信号
sigset_t sa_mask; //屏蔽的信号集
int sa_flags; //0表示无惨信号处理,SA_SIGINFO表示带参信号处理函数
void (*sa_restorer)(void); //废弃
};
int sigqueue(pid_t pid, int sig, const union sigval value); //发送信号,指定进程id,和附带的参数