代码之家  ›  专栏  ›  技术社区  ›  conradev

当fileDescriptor无效时,write()会导致致命的崩溃

  •  1
  • conradev  · 技术社区  · 15 年前

    我正在写一个有网络服务器的iPhone应用程序。为了处理一个Web请求,我接受这个Web请求并将我想要发送的数据()写入它。

    当我尝试下载一个中等大小的文件(3-6MB)时,它可以正常工作,但是如果中途取消下载,应用程序就会崩溃,不会留下任何错误痕迹。我认为文件描述符在写入过程中会失效,从而导致崩溃。我真的不知道这是不是造成车祸的原因,我只是假设。

    我的网络服务器基于 this 例子。

    NSString *header = @"";
    NSData *data = [NSData dataWithContentsOfFile:fullPath];
    write (fd, [header UTF8String], [header length]);
    write(fd, [data bytes], [data length]);
    close(fd);
    

    有人知道怎么解决这个问题吗?我想先把数据分块,然后再写下每一部分,但我认为这没什么用。

    1 回复  |  直到 14 年前
        1
  •  2
  •   al45tair Sergey Kalinichenko    14 年前

    听起来您的应用程序可能正在接收信号 SIGPIPE 由于试图写入断开的套接字。你需要忽略 硅管 在代码中使用类似以下的信号:

    #include <signal.h>
    
    signal (SIGPIPE, SIG_IGN);
    

    我建议你在你的 main() 功能。

    另外,你最好使用 NSInputStream / NSOutputStream 或者他们的核心基金会, CFReadStream / CFWriteStream ,因为可以使它们使用运行循环来允许异步操作。

    推荐文章