首页 文章

C:pthread segfaults

提问于
浏览
4

我正在使用pthread编写我的第一个C程序 . 我想为commadline(argv)上提供的所有(非选项)参数运行我的函数 sha1sum .

pthread_t t[256];

c = 0;
for (n = optind; n < argc; n++) {
    if(pthread_create(&t[c], NULL, sha1sum, argv[n])) {
        fprintf(stderr, "Error creating thread\n");
        return 1;
    }
    c++;
}

c = 0;
for (n = optind; n < argc; n++) {
    pthread_join(t[c]);
    c++;
}

使用2个命令行参数运行我的程序时( file1file2 ) . 在成功执行sha1sum函数之后,有时会立即进行段错误,有时会在最后进行 .

有人可以指出出了什么问题吗?

编辑

事实证明,该计划有时仍然是segfaulting . 有时候,有时在中间,有时从不:

我在下面发布了整个MCV示例:

#include <stdio.h>
#include <getopt.h>
#include <unistd.h>
#include <locale.h>
#include <pthread.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <openssl/evp.h>    

static unsigned char flag = 0;


int sha1sum(char *filename) {

    FILE *f;
    size_t len;
    unsigned char buffer[BUFSIZ]; 

    EVP_MD_CTX hashctx;
    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();

    const EVP_MD *hashptr = EVP_get_digestbyname("SHA1");

        f = fopen(filename, "r");

        EVP_MD_CTX_init(&hashctx);
        EVP_DigestInit_ex(&hashctx, hashptr, NULL);

        do {
                len = fread(buffer, 1, BUFSIZ, f);
                EVP_DigestUpdate(&hashctx, buffer, len);
        } while (len == BUFSIZ);

        unsigned int outlen;
        EVP_DigestFinal_ex(&hashctx, buffer, &outlen);
        EVP_MD_CTX_cleanup(&hashctx);

        int i;
        for (i = 0; i < outlen; i++)
                printf("%02x", buffer[i]);

        printf("\n");
        fclose(f);

    pthread_exit(NULL);
}


int main(int argc, char **argv) {

    int c,n;
    pthread_t t[256];

    while ((c = getopt(argc, argv, "c")) != EOF) switch(c) {
        case 'c':
            flag |= 1;
            break;
    }

    c = 0;
    for (n = optind; n < argc; n++) {

        if (pthread_create(&t[c], NULL, &sha1sum, argv[n])) {
            fprintf(stderr, "Error creating thread\n");
            return 1;
        }
        c++;
    }

    c = 0;
    for (n = optind; n < argc; n++) {
        pthread_join(t[c], NULL);
        c++;
    }

    return 0;
}

编辑2

添加 #include <pthread.h> 后,我现在在编译时收到以下错误/警告:

test.c: In function ‘main’:
test.c:67:9: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
In file included from test.c:9:0:
/usr/include/pthread.h:225:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘int (*)(char *)’

2 回答

  • 2

    我对您的代码做了一些小改动 . 现在它不会崩溃 .

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    #include <getopt.h>
    
    void *sha1sum(void) {
        char *a = malloc(10);
        strcpy(a, "hello world\n");
        pthread_exit((void *) a);
    }
    
    int main(int argc, char **argv) {
        pthread_t t[256];
        int n = 0;
        int c = 0;
        char *b;
        for (n = optind; n < argc; n++) {
            if (pthread_create(&t[c], NULL, &sha1sum, argv[n])) {
                fprintf(stderr, "Error creating thread\n");
                return 1;
            }
            c++;
        }
        c = 0;
        for (n = optind; n < argc; n++) {
            pthread_join(t[c], (void **) &b);
            printf("b is %s", b);
            c++;
        }
        return 0;
    }
    

    测试

    ./a.out foo bar baz bletch
    b is hello world
    b is hello world
    b is hello world
    b is hello world
    
  • 3

    pthread_join(t[c]) 更改为 pthread_join(t[c], NULL)

相关问题