pthread_create创建线程后 errno为2
时间: 2023-11-15 16:59:00 浏览: 262
根据提供的引用内容,pthread_create()函数创建线程后 errno为2表示传递给函数的attr参数无效。attr参数是一个指向线程属性结构体的指针,如果该参数无效,则会返回错误码2。建议检查传递给pthread_create()函数的attr参数是否正确。如果attr参数为NULL,则使用默认线程属性。如果attr参数不为NULL,则必须使用pthread_attr_init()函数初始化线程属性结构体。如果仍然无法解决问题,可以查看系统的错误日志以获取更多信息。
相关问题
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的作用
以上代码中,`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` 实现了线程的同步等待,直到捕获到指定的信号。
pthread_create函数
`pthread_create` 函数是 POSIX 线程库中用于创建线程的函数,其原型如下:
```c
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
```
该函数的参数解释如下:
- `thread`:一个指向 pthread_t 类型变量的指针,用于存储创建的线程 ID。
- `attr`:一个指向 pthread_attr_t 类型变量的指针,用于指定创建线程的属性,可以为 `NULL`。
- `start_routine`:一个函数指针,指向线程的起始函数。
- `arg`:传递给线程起始函数的参数。
`pthread_create` 函数成功时返回 0,失败时返回一个非 0 值,具体错误码可以使用 `errno` 变量查看。创建成功后,新线程将立即开始执行指定的 `start_routine` 函数。
举个例子,以下代码创建了一个新的线程,该线程通过调用 `print_message()` 函数打印一条消息。注意,该代码使用了 `pthread_join` 函数等待新线程完成。
```c
#include <stdio.h>
#include <pthread.h>
void *print_message(void *message) {
printf("%s\n", (char *)message);
pthread_exit(NULL);
}
int main() {
pthread_t thread;
char *message = "Hello, world!";
int ret = pthread_create(&thread, NULL, print_message, (void *)message);
if (ret) {
printf("Failed to create thread: %d\n", ret);
return -1;
}
pthread_join(thread, NULL);
return 0;
}
```
阅读全文