You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ FIFO服务器读取用户名异常问题求助

问题分析与修复方案

你的服务器代码存在几个关键错误,导致无法正确读取用户名:

1. 文件描述符非法转换

在第二个read调用中,你错误地将文件描述符fd强制转换为char类型:

read((char)fd, &username, sizeof(char)* length)

这会把原本的整数文件描述符变成一个字符值,完全不是合法的文件句柄,导致读取失败。应该直接使用fd,不需要任何转换。

2. 未初始化的指针与内存分配缺失

username是一个未初始化的char*指针,没有为其分配足够的内存来存储用户名。直接对&username进行read操作会写入非法内存地址,引发未定义行为。你需要在读取长度后,为username分配大小为length + 1的内存(额外空间用于存储终止符\0)。

3. 终止符处理错误

你使用strlen(username)来添加终止符,但此时username指向的内存可能没有有效的字符串终止符,strlen会越界读取内存,导致不可预测的结果。既然已经知道用户名的长度length,直接在username[length]位置设置\0即可。

修复后的代码

修改后的copyUsername函数

void copyUsername(int fd, char *&username, int &length)
{
  printf("Waiting for client login...\n");

  if (read(fd, &length, sizeof(int)) == -1)
  {
    printf("Could not read in the fifo 1\n");
    return;
  }
  printf("Client wrote an username\n");

  printf("%d\n", length);
  // 分配内存,额外留一个位置存终止符
  username = (char*)malloc(sizeof(char) * (length + 1));
  if (!username) {
    printf("Failed to allocate memory for username\n");
    return;
  }
  // 正确使用fd,读取到username指向的内存
  if (read(fd, username, sizeof(char)* length) == -1)
  {
    printf("Could not read in the fifo 2\n");
    free(username); // 分配失败要释放内存
    username = nullptr;
    return;
  }
  // 直接用已知长度设置终止符
  username[length] = '\0';
  printf("%s\n", username);
  printf("Copied successfully from FIFO %s\n", username);
}

额外注意事项

  • 在后续使用完username后,记得调用free(username)释放内存,避免内存泄漏。
  • 确保客户端发送的length值是正确的用户名长度(不包含终止符),否则会导致内存浪费或字符串截断。

内容的提问来源于stack exchange,提问作者fabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:55:29