pthread_create() 后的分段错误

Segmentation Fault after pthread_create()

用这个创建一个线程:

pthread_t thread; 
pthread_create(&thread, NULL, (void*)&serve_connection, (void*)sockfd);

我调用的函数定义为:

void serve_connection (void* sockfd) {
ssize_t  n, result;
char line[MAXLINE];
connection_t conn;
connection_init (&conn);
conn.sockfd = *((int*)sockfd);
while (! shutting_down) {
...
...
}}

函数的其余部分在“...”中,但它无关紧要,因为我已将段错误跟踪到

conn.sockfd = *((int*)sockfd);

其中 conn.sockfd 的类型为 'int'。

最初 serve_connection 是:

void serve_connection (int sockfd){
...
conn.sockfd = sockfd;
...
}

但我是从线程调用它的,因此必须进行更改。我还应该注意,传递给 pthread_create 的 sockfd 是一个具有值的 int。

我在编译时也收到了这些警告:

warning: ISO C forbids conversion of function pointer to object pointer type
warning: cast to pointer from integer of different size
warning: ISO C forbids passing argument 3 of âpthread_createâ between function pointer and âvoid *â
note: expected âvoid * (*)(void *)â but argument is of type âvoid *â

这些都是指我调用pthread_create的那一行。直到现在我都忽略了警告,因为程序运行到上面指定的行,所以我假设函数被正确调用。我只是无法弄清楚是什么导致了分段错误,因为我对使用 pthreads 还是陌生的(我假设我正在调用或声明错误,但查看库并没有真正帮助)。

我认为你应该按如下方式更改分配:

conn.sockfd = (int)sockfd;

对于你的情况,考虑更换

conn.sockfd = *((int*)sockfd);

来自

conn.sockfd = (int)sockfd;

You didn't have passed the sockfd variable as a pointer so you cannot dereference it. Take a look at : http://en.wikipedia.org/wiki/Dereference_operator