У меня есть следующий код, служащий основным контуром для сервера, который принимает входящие соединения сокетов.Ошибка сегментации в системном вызове accept
В настоящий момент макрос OperationMode определяется как 1, поэтому он выполнит логику pthread.
for (hit = 1 ;; hit++) {
printf("Got here\n\n");
length = sizeof(cli_addr);
/* block waiting for clients */
socketfd = accept(listenfd, (struct sockaddr *) &cli_addr, &length);
if (socketfd < 0)
printf("ERROR system call - accept error\n");
else
{
printf("Testing\n\n\n");
#ifdef OperationMode
pthread_t thread_id;
if(pthread_create(&thread_id, NULL, attendFTP(socketfd, hit), NULL))
{
perror("could not create thread");
return 1;
}
#else
pid = fork();
if(pid==0)
{
ftp(socketfd, hit);
}
else
{
close(socketfd);
kill(pid, SIGCHLD);
}
#endif
}
}
Я смог создать поток для первого подключения входящего сокета, но когда я итерацию по петле я получаю ошибку сегментации ошибки в строке
socketfd = accept(listened, (struct sockaddr *) &cli_addr, &length);
Моя функция attendFTP имеет следующий код
void *attendFTP(int fd, int hit)
{
ftp(fd, hit);
return NULL;
}
Это идеальное решение для реализации вилки. Как я могу исправить ошибку ошибки сегментации?
Если 'attendFTP()' - функция, возвращающая указатель на функцию, вы используете 'pthread_create()' неправильно. – EOF
@EOF Я добавил функцию 'attendFTP()'. Но я считаю, что правильно его использую. – rafaelcpalmeida
Вы не используете его правильно. Прототипом является 'int pthread_create (pthread_t * thread, const pthread_attr_t * attr, void * (* start_routine) (void *), void * arg);'. Вам, вероятно, потребуется передать указатель на 'struct', если вам нужно несколько аргументов для функции, которую вы хотите выполнить нить. – EOF