linux信号怎么用,linux下信号使用

信号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,和附带的参数

标签:struct,sigset,int,linux,信号,使用,进程,pw

来源: https://blog.csdn.net/Dam_Sam/article/details/100086274

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值