通过pthread_create()函数设置errno(问题)

时间:2014-09-09 08:59:46

标签: multithreading thread-safety pthreads fork errno

我在ubuntu和嵌入式linux(我们的项目芯片)上运行以下代码。但产出不同。为什么在嵌入式Linux上运行时线程errno为0?我怎样才能获得相同的输出? pthread_create()函数可以设置errno吗?

此外我使用fork()函数而不是pthread_create()函数。在这个例子中,我用ubuntu得到了相同的输出。 例如:

if (fork())
    print_message_function("foo");

ubuntu的:

>>main errno: 2
>>thread errno: 2

嵌入linux:

>>main errno: 2
>>thread errno: 0
当使用fork()函数时,

嵌入linux:

>>main errno: 2
>>thread errno: 2

#include <unistd.h>     /* Symbolic Constants */
#include <sys/types.h>  /* Primitive System Data Types */
#include <errno.h>      /* Errors */
#include <stdio.h>      /* Input/Output */
#include <stdlib.h>     /* General Utilities */
#include <pthread.h>    /* POSIX Threads */
#include <string.h>     /* String handling */
#include <time.h>

typedef struct str_thdata
{
    int thread_no;
    char message[100];
} thdata;

int createError(char *str)
{
    int retVal = 0;

    if (NULL == fopen("YOK", "r"))
    {
        printf(">>%s errno: %d\n",str, errno);
        retVal = -errno;
    }
    return retVal;
}

void print_message_function ( void *ptr )
{
    int retVal;
    thdata *data;
    data = (thdata *) ptr;

    retVal = createError("thread");

    while(1)
        ;

    pthread_exit(0);
}

int main()
{
int retVal = 0;
    pthread_t thread1;
    thdata data1;

    data1.thread_no = 1;
    strcpy(data1.message, "Hello!");


    /*if (fork())
        print_message_function("foo");
    */
    pthread_create (&thread1, NULL, (void *) &print_message_function, (void *) &data1);

    retVal = createError("main");
    while(1)
    {

    }

    pthread_join(thread1, NULL);

    exit(0);
}

1 个答案:

答案 0 :(得分:3)

pthread函数返回错误值,但不设置errno。这可能是因为errno在设计pthread时不是特定于线程的。

用法示例:

int err = pthread_create(...);
if(err) {
    fprintf(stderr, "pthread_create: (%d)%s\n", err, strerror(err));
    exit(EXIT_FAILURE);
}