用这个创建一个线程:
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(我假设我正在调用或声明错误,但查看库并没有真正帮助)。
答案 0 :(得分:2)
在您的情况下,请考虑替换
conn.sockfd = *((int*)sockfd);
通过
conn.sockfd = (int)sockfd;
您没有将 sockfd 变量作为指针传递,因此您无法取消引用它。看看:http://en.wikipedia.org/wiki/Dereference_operator
答案 1 :(得分:1)
我认为您应该按如下方式更改作业:
conn.sockfd = (int)sockfd;