我正在使用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个命令行参数运行我的程序时( file1
, file2
) . 在成功执行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 回答
我对您的代码做了一些小改动 . 现在它不会崩溃 .
测试
将
pthread_join(t[c])
更改为pthread_join(t[c], NULL)