【问题标题】:C: "read: Bad Address" and "write: Bad Address"C:“读取:错误地址”和“写入:错误地址”
【发布时间】:2013-04-21 13:11:36
【问题描述】:

我想使用 FIFO 的服务器-客户端模型和客户端获取目录路径,但我收到错误“读取:错误地址”和“写入:错误地址”。

客户

服务器错误:“读取:错误地址”

客户端的错误:“写入:错误地址”

【问题讨论】:

  • 阅读一些关于 C 编程和 Linux 编程的好书。使用strlen(pathName) 作为read 的长度参数确实是错误的,表明你很困惑...... 花了一两天阅读好材料后,再次编写程序,使用gcc -Wall -g 编译它,改进它直到您不会收到任何警告,并使用gdb 调试器对其进行调试。

标签: c linux unix system


【解决方案1】:

您可能误用了来自readwrite 的返回值。成功时它们返回正值,您将它们作为错误处理。

同时读取字符串的大小是未知的。所以strlen是不合适的。

 if( (controlRead = read(fdp,pathName,sizeof(pathName)) ) <= 0)
 {
     // error ...

write 相同。

在传输字符串时,最好同时传输字符串长度:

写作:

void write_string(int fd, const char *string)
{
    size_t len = strlen(string);
    write(fd, &len, sizeof(len));
    write(fd, string, len);
}

阅读:

void read_string(int fd, char *buffer, size_t size, size_t *len)
{
    size_t t_len;

    read(fd, &t_len, sizeof(t_len));
    if (t_len > size) t_len = size;
    read(fd, buffer, t_len);
    if (t_len < size) buffer[t_len] = 0; // null-terminate if there is enough space
    if (len) *len = t_len; // return length if wanted
}

【讨论】:

  • 不,strlen(pathName) 应该是 sizeof(pathName)
  • @BasileStarynkevitch 是的,那个也是。谢谢。
猜你喜欢
  • 2020-09-30
  • 2013-12-25
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多