2015-02-25 4 views
0

Создание нить с этим:Сегментация Fault после 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; 
... 
} 

Но я зову его из потока, так что должно быть изменено. Я должен также отметить, что sockfd передается pthread_create, это 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

В вашем случае, рассмотреть вопрос о замене

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

по

conn.sockfd = (int)sockfd; 

Вы не прошли sockfd vari в качестве указателя, чтобы вы не могли его разыменовать. Посмотрите на: http://en.wikipedia.org/wiki/Dereference_operator

1

Я думаю, вы должны изменить назначение следующим образом:

conn.sockfd = (int)sockfd; 
Смежные вопросы