Linux进程间通信——信号( 二 )

  • int sigemptyset(sigset_t *set);功能:将某个信号集清0返回值:成功返回0 ,失败返回-1
  • int sigfillset(sigset_t *set);功能:将某个信号置1返回值:成功返回0 ,失败返回-1
  • int sigaddset(sigset_t *set, int signo);功能:将某个信号加入到信号集中返回值:成功返回0 ,失败返回-1
  • int sigdelset(sigset_t *set, int signo);功能:用来将参数signo信号从参数set信号集里删除 。 返回值:成功则返回0 , 如果有错误则为-1 。
  • int sigismember(const sigset_t *set, int signo);功能:用来测试参数signo信号是否已加入至参数set信号集里 。 返回值:如果信号集里已有该信号则返回1 , 否则返回0 。 错误则为-1
  • int sigprocmask(int how, const sigset_t *set, sigset_t *oset);功能:读取或更改进程的信号屏蔽字 。 返回值:若成功则为0 , 若出错则为-1
  • 参数how的含义
    Linux进程间通信——信号文章插图
    • int sigpending(sigset_t *set);功能: sigpending读取当前进程的未决信号集 , 通过set参数传出 。 返回值:若成功则为0 , 若出错则为-1
    • void abort(void);头文件:功能:向进程发送sigabort信号 , 默认情况下进程会异常退出 , 当然可定义自己的信号处理函数 。 说明:即使sigabort被进程设置为阻塞信号 , 调用abort()后 , sigabort仍然能被进程接收 。 该函数无返回值
    讲了这么多 , 做个例子 , 主要实现的功能是:打印当前进程未决信号集 , 并测试屏蔽信号
    #include #include #include #include #include void printf_ped(sigset_t* ped){ int i; for (i = 0; i < 32; i++) {if (sigismember(ped, i) == 1){putchar('1');}else{putchar('0');} } printf("\n");}int main(void){ sigset_t myset, oldset, ped_set; sigemptyset(//清空信号集为0 sigaddset(//添加信号到信号集中 sigprocmask(SIG_BLOCK,//设置进程的信号屏蔽字 while (1) {sigpending(//读取未决信号集到ped_set中printf_ped(//打印打印未决信号集sleep(3); } return 0;}运行结果如下
    Linux进程间通信——信号文章插图
    一开始没有产生信号 未决信号集都为0 , 当我们按下crtl+\时产生3号信号 , 但是由于我们屏蔽了3号信号 , 未决信号集中第三位一直为1 , 表示该信号还未被处理
    定时器相关函数头文件 #include
    alarm函数
    • 每个进程只有一个alarm
    • 无论进程处于何种状态下 , 定时器都在计时
    函数原型:unsigned int alarm(unsigned int seconds);
    功能:专门为sigalrm信号而设 , 在指定的时间seconds秒后 , 将向进程本身发送sigalrm信号
    返回值:如果调用alarm()前 , 进程中已经设置了闹钟时间 , 则返回上一个闹钟时间的剩余时间 , 否则返回0
    说明:进程调用alarm后 , 任何以前的alarm()调用都将无效
    setitimer函数函数原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
    参数:第一个参数 which指定定时器类型第二个参数 结构itimerval的一个实例第三个参数 可不做处理 , old_value一般设为NULL
    结构体类型如下struct itimerval {struct timeval it_interval; /* 下一次的取值 */struct timeval it_value; /* 本次的设定值 */};struct timeval {long tv_sec; /* 秒 */long tv_usec; /* 微秒 , 1秒 = 1000000 微秒*/};功能:这个函数可以周期性计时 , 定时器将it_value递减到0时 , 产生一个信号 , 并将it_value的值设定为it_interval的值 , 然后重新开始计时 , 如此往复 , 若it_interval为0则定时器停止 。 参数ovalue如果不为空 , 则其中保留的是上次调用设定的值
    返回值:成功返回0 , 失败返回-1
    定时器类型:itimer_real: 按实际时间计时(系统时间+用户时间+等待时间) , 经过指定的时间后 , 内核将发送SIGALRM信号给本进程itimer_virtual :只计算进程占用cpu的时间,经过指定的时间后 , 内核将发送SIGVTALRM信号给本进程itimer_prof :计算占用cpu及执行系统调用的时间 , 经过指定的时间后 , 内核将发送SIGPROF信号给本进程
    写个例子 , 每3秒打印一次hello world
    #include #include #include #include void myfun(int signo){ printf("hello world\n");}int main(){ struct itimerval it, oldit; int ret; signal(SIGALRM, myfun); //本次设定值 it.it_value.tv_sec = 3; it.it_value.tv_usec = 0; //下次设定值 it.it_interval.tv_sec = 3; it.it_interval.tv_usec = 0; ret = setitimer(ITIMER_REAL,if (ret == -1) {printf("error\n");exit(1); } while (1); return 0;}运行结果
    Linux进程间通信——信号文章插图