接受系统调用中的分段错误
Segmentation fault in accept system call
我将以下代码用作接受传入套接字连接的服务器的主循环。
此时宏 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;
}
这非常适合分叉实施。如何修复分段错误?
pthread_create(&thread_id, NULL, attendFTP(socketfd, hit), NULL);
此代码传递给定参数对 attendFTP()
的调用结果 - 此结果始终为 NULL。
所以 pthread_create 试图在 NULL 地址启动一个函数,相应地,失败了。
如果你 运行 你的编译器带有 -pedantic
参数,编译器会告诉你你所做的是错误的。没有 -pedantic
,gcc 允许一些 'extensions',这可能会隐藏错误。顺便说一句,这就是为什么 -pedantic
在我看来是必须的。
您真正想要的是将一些参数传递给您的线程函数。不幸的是,它在 C pthreads 中确实很复杂,需要您分配和释放上述 struct
。像这样:
struct args {
int fd;
int hit;
};
...
pthread_t thread_id;
struct args* args = malloc(sizeof(struct args));
args->fd = socketfd;
args->hit = hit;
if(pthread_create(&thread_id, NULL, attendFTP, args))
....
void* attendFTP(void* vargs)
{
struct args* args = vargs;
ftp(args->fd, args->hit);
free(args);
return NULL;
}
我将以下代码用作接受传入套接字连接的服务器的主循环。
此时宏 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;
}
这非常适合分叉实施。如何修复分段错误?
pthread_create(&thread_id, NULL, attendFTP(socketfd, hit), NULL);
此代码传递给定参数对 attendFTP()
的调用结果 - 此结果始终为 NULL。
所以 pthread_create 试图在 NULL 地址启动一个函数,相应地,失败了。
如果你 运行 你的编译器带有 -pedantic
参数,编译器会告诉你你所做的是错误的。没有 -pedantic
,gcc 允许一些 'extensions',这可能会隐藏错误。顺便说一句,这就是为什么 -pedantic
在我看来是必须的。
您真正想要的是将一些参数传递给您的线程函数。不幸的是,它在 C pthreads 中确实很复杂,需要您分配和释放上述 struct
。像这样:
struct args {
int fd;
int hit;
};
...
pthread_t thread_id;
struct args* args = malloc(sizeof(struct args));
args->fd = socketfd;
args->hit = hit;
if(pthread_create(&thread_id, NULL, attendFTP, args))
....
void* attendFTP(void* vargs)
{
struct args* args = vargs;
ftp(args->fd, args->hit);
free(args);
return NULL;
}