pthread_create()后的分段错误

时间:2015-02-25 21:14:57

标签: c segmentation-fault pthreads

用这个创建一个线程:

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) {
...
...
}}

函数的其余部分位于'...'但是它无关紧要,因为我已经跟踪了seg错误

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(我假设我正在调用或声明错误,但查看库并没有真正帮助)。

2 个答案:

答案 0 :(得分:2)

在您的情况下,请考虑替换

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

通过

conn.sockfd = (int)sockfd;
  

您没有将 sockfd 变量作为指针传递,因此您无法取消引用它。看看:http://en.wikipedia.org/wiki/Dereference_operator

答案 1 :(得分:1)

我认为您应该按如下方式更改作业:

conn.sockfd = (int)sockfd;