我试图在Linux中创建一个带有命名管道的服务器/客户机程序。每当客户端连接并进行身份验证时,服务器将其数据(pid和密码)存储在链表中。
问题是,在我存储第一个客户端的数据之后,每当我试图存储更多的数据(客户端)时,程序"给出"分段错误。
typedef struct client client, *pno;
struct client
{
pid_t pid;
char password[TAM_MAX];
pno next;
};
int verify_struct(pno cliente_t)
{
if (cliente_t == NULL) //verifica se a lista está vazia
return 1;
else
return 0;
}
pno AddClient(pno cliente_t, pid_t pid, char password[TAM_MAX])
{
pno new, aux;
new = malloc(sizeof(client)); //aloca espaço
if(new == NULL) //verifica se alocou o espaço com sucesso
{
printf("Memory allocation error!n");
return cliente_t;
}
new->pid = pid;
strncpy(new->password, password, TAM_MAX-1);
if(verify_struct(cliente_t))
{
printf("Should be at startn");
cliente_t = new;
printf("Added at start!n");
}
else
{
//insert at end
printf("Adding in the end!n");
aux = cliente_t;
while(aux->next != NULL)
aux = aux->next;
aux->next = new;
printf("Added sucssefully!n");
}
return cliente_t;
}
bool isValidUser(pno cliente, pid_t pid, char password[TAM_MAX])
{
while(cliente != NULL)
{
if(cliente->pid == pid && strncmp(password, cliente->password, 100) == 0)
{
return true;
}
cliente = cliente -> proximo;
}
return false;
}
//progam itself :
int main(void)
{
pno client=NULL;
/* --code-- */
while(1)
{
if(request.loggedIn == 0)
{
client=AddClient(client, request.pid, request.password);
}
else
{
if(!isValidUser(cliente, perg.pid_cliente, perg.password))
abort();
//process commands
}
}
}
输出:
1st Client -> Should be at start!
-> Added at start!
2nd Client -> Adding in the end!
-> segmentation fault (core dumped).
您需要将这一行添加到AddClient
new->next = NULL;
否则new->next
包含未初始化的内存。稍后,当您检查aux->next != NULL
时(aux现在等于之前的new),测试的结果不会为true,因为未初始化的内存并不恰好等于0。然后尝试在未初始化的内存中找到该值指向的另一个节点。它可能包含的数据实际上不是一个合法的内存地址,因此分段错误。
有两个非常相似的问题:
- 当添加到列表的末尾时,您需要确保
new->next
包含NULL
,正如已经提到的@morningstar。 -
当添加到列表的开始时,您需要确保
new->next
包含cliente_t
(在将其分配给new
之前)。例如:printf("Should be at startn"); new->next = cliente_t; cliente_t = new; printf("Added at start!n");
由于cliente = cliente -> proximo;
未定义成员,代码无法编译…我猜你的意思是修改为-> next
。请确保您在将来测试您的测试用例。