Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C pthreads函数是否在内部设置errno?_C_Linux_Pthreads - Fatal编程技术网

C pthreads函数是否在内部设置errno?

C pthreads函数是否在内部设置errno?,c,linux,pthreads,C,Linux,Pthreads,在下面的代码中,我调用线程id为self的pthread_join()。结果是它返回错误号35。所以我想和佩罗一起打印。但它正在展示“成功”。我的疑问是库/系统调用是否需要为任何错误明确设置errno,或者我是否遗漏了任何内容 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include

在下面的代码中,我调用线程id为self的pthread_join()。结果是它返回错误号35。所以我想和佩罗一起打印。但它正在展示“成功”。我的疑问是库/系统调用是否需要为任何错误明确设置errno,或者我是否遗漏了任何内容

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>

#define DEATH(mess) { perror(mess); exit(errno); }

static void * threadFunc(void *arg)
{
 void *res;
 printf("sleeping for 2 sec ...\n");
 sleep(2);
 char *s = (char *) arg;
 pthread_t t = pthread_self();
 int relval = pthread_join(t, &res);

 if (relval) 
  perror("deadlock");

  printf("return value is %d .....\n",relval);
  return (void *) strlen(s);
}

int main(int argc, char *argv[])
{
 pthread_t t1;
 void *res;
 int ret;

 ret = pthread_create(&t1, NULL, threadFunc, "Hello world\n");
 if (ret != 0)
    DEATH ("pthread_create");

 printf("Message from main()\n");

 pthread_exit(&res);
 exit(EXIT_SUCCESS);

不要求SR函数设置
errno
,也不要求它们单独设置。您始终可以自由地执行以下操作:

errno = pthread_join(t, &res);
pthread\u join()未设置errno值

请参阅此处的讨论:

最好的办法是只使用pthread_join的返回值,然后做几件事

  • 您不应该从线程本身内部进行连接。连接应该从父线程完成,以清理那里的资源
  • errno变量是每线程变量。当您在线程内和主线程中访问它时,它的值将不同

  • 为什么不阅读手册页?这不是疑问,这是一个问题。还要注意,没有可靠的方法可以导致
    pthread\u join
    返回错误。它可能返回的唯一可能的错误涉及到调用未定义行为的情况,例如在线程生命周期结束后使用线程ID。谢谢--这使我意识到我也可以将其与
    perror
    一起使用,因为(在我的系统上)所有
    pthread\u join
    pthread\u create
    可能返回的代码都是
    peror
    -
    EAGAIN
    ESRCH
    等理解的标准代码(基于El Capitan OS X 10.11.3上的手册页)。不过,我不知道这是否是pthreads标准的一部分。
    errno = pthread_join(t, &res);