int main(int argc, char ** argv) { //线程调度相关 struct sched_param svparam = { .sched_priority = 71 }; pthread_attr_t svattr; sigset_t set; int sig; sigemptyset( & set); sigaddset( & set, SIGINT); sigaddset( & set, SIGTERM); sigaddset( & set, SIGHUP); pthread_sigmask(SIG_BLOCK, & set, NULL); pthread_attr_init( & svattr); pthread_attr_setdetachstate( & svattr, PTHREAD_CREATE_JOINABLE); pthread_attr_setinheritsched( & svattr, PTHREAD_EXPLICIT_SCHED); pthread_attr_setschedpolicy( & svattr, SCHED_FIFO); pthread_attr_setschedparam( & svattr, & svparam); errno = pthread_create( & svtid, & svattr, & server, NULL); if (errno) fail("pthread_create"); sigwait( & set, & sig); pthread_cancel(svtid); pthread_join(svtid, NULL); return 0; } 以上代码汇总sigwait函数的作用以及set的作用
时间: 2024-04-10 18:35:02 浏览: 76
以上代码中,`sigwait()` 函数的作用是阻塞等待指定的信号集中的信号,直到其中一个信号被捕获到。`sigwait()` 函数的原型为:
```c
int sigwait(const sigset_t *set, int *sig);
```
其中,`set` 是一个指向信号集的指针,它包含了要等待的信号;`sig` 是一个指向整数的指针,用于存储捕获到的信号的编号。
在给定的代码中,首先使用 `sigemptyset()` 函数清空了 `set` 信号集,然后使用 `sigaddset()` 函数向 `set` 中添加了三个信号:`SIGINT`、`SIGTERM` 和 `SIGHUP`。这意味着程序将等待这三个信号中的任何一个。
然后,通过调用 `pthread_sigmask()` 函数将 `set` 信号集设置为线程的信号掩码,以阻塞这三个信号。这样,当线程执行到 `sigwait()` 函数时,它将被阻塞,直到其中一个信号被捕获到。
最后,通过调用 `sigwait()` 函数等待信号,并将捕获到的信号存储在 `sig` 变量中。接下来的代码根据捕获到的不同信号做出相应的处理。
总结起来,以上代码使用 `sigwait()` 函数和信号集 `set` 实现了线程的同步等待,直到捕获到指定的信号。
相关问题
计算并输出(p->q)^r的真值表 #include <stdio.h> int main(int argc, char **argv){ //在下面Begin和End之间补全代码 /*****Begin *****/ /*****end*****/ return 0; }
(p->q)^r的真值表如下:
p q r (p->q)^r
0 0 0 1
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 0
1 1 1 1
代码如下:
#include <stdio.h>
int main(int argc, char **argv){
int p, q, r;
printf("p q r (p->q)^r\n");
for (p = 0; p <= 1; p++) {
for (q = 0; q <= 1; q++) {
for (r = 0; r <= 1; r++) {
printf("%d %d %d %d\n", p, q, r, ((p && q) || !p) ^ r);
}
}
}
return 0;
}
解析下列代码int main(int argc, char *argv[]) { pthread_attr_t mtd_attr; pthread_attr_init(&mtd_attr); pthread_attr_setinheritsched(&mtd_attr,PTHREAD_EXPLICIT_SCHED); pthread_attr_setschedpolicy(&mtd_attr,SCHED_OTHER); struct sched_param send_param; send_param.__sched_priority = 60; pthread_attr_setschedparam(&mtd_attr,&send_param); pthread_attr_setscope(&mtd_attr,PTHREAD_SCOPE_SYSTEM); pthread_t mtd_thread; int mtd_task_id; if((mtd_task_id=pthread_create((pthread_t *)(&mtd_thread),&mtd_attr,mtd_test,NULL))!=0) { printf("mtd_thread failed..\n"); } else { printf("mtd_thread tid %d..\n",mtd_task_id); } pthread_join(mtd_thread, NULL); return 0; }
这是一个使用 pthread 库的多线程程序,主要是创建一个线程并等待它的结束。下面是代码的详细解析:
1. `int main(int argc, char *argv[])`:程序的主函数。
2. `pthread_attr_t mtd_attr;`:定义线程属性对象 mtd_attr。
3. `pthread_attr_init(&mtd_attr);`:初始化线程属性对象 mtd_attr。
4. `pthread_attr_setinheritsched(&mtd_attr,PTHREAD_EXPLICIT_SCHED);`:设置线程属性对象 mtd_attr 的继承调度策略为 PTHREAD_EXPLICIT_SCHED。
5. `pthread_attr_setschedpolicy(&mtd_attr,SCHED_OTHER);`:设置线程属性对象 mtd_attr 的调度策略为 SCHED_OTHER。
6. `struct sched_param send_param; send_param.__sched_priority = 60;`:定义并设置调度参数对象 send_param 的优先级为 60。
7. `pthread_attr_setschedparam(&mtd_attr,&send_param);`:设置线程属性对象 mtd_attr 的调度参数为 send_param。
8. `pthread_attr_setscope(&mtd_attr,PTHREAD_SCOPE_SYSTEM);`:设置线程属性对象 mtd_attr 的作用域为 PTHREAD_SCOPE_SYSTEM。
9. `pthread_t mtd_thread;`:定义线程对象 mtd_thread。
10. `int mtd_task_id;`:定义线程 ID 变量 mtd_task_id。
11. `if((mtd_task_id=pthread_create((pthread_t *)(&mtd_thread),&mtd_attr,mtd_test,NULL))!=0)`:创建线程,并将其 ID 赋值给 mtd_task_id。其中,pthread_create() 函数的第一个参数是指向线程对象的指针,第二个参数是指向线程属性对象的指针,第三个参数是指向线程函数的指针,最后一个参数是线程函数的参数,这里设置为 NULL。
12. `printf("mtd_thread tid %d..\n",mtd_task_id);`:输出线程 ID。
13. `pthread_join(mtd_thread, NULL);`:等待线程结束,如果线程没有结束,主线程就会一直阻塞在这里。
14. `return 0;`:返回程序运行结果。
阅读全文