【问题标题】:Read system Call读取系统调用
【发布时间】:2010-08-31 06:09:41
【问题描述】:

我正在尝试使用 C 语言进行 unix 套接字编程。但在阅读时,我得到的 Err No 为 4。我无法找到此错误代码的描述。有人知道吗?

【问题讨论】:

    标签: c sockets unix


    【解决方案1】:

    如果您从查看 Unix 错误代码名称 (/usr/include/errno.h) 的最终来源开始,您将看到包含错误代码的文件

    #define EINTR            4      /* Interrupted system call */
    

    (作为练习,这个文件是留给你找出来的;))

    【讨论】:

      【解决方案2】:

      errno 值对于不同的系统(甚至是不同的类 Unix 系统)可能不同,因此应在代码中使用符号常量。

      perror 函数将打印出(到 stderr )最后一个 errno 值的描述性字符串以及您提供的字符串。

      man 3 perror
      

      strerror 函数只是将const char * 返回到perror 打印的字符串。

      如果 4 在您的系统上是EINTR,那么您在调用读取期间收到了一个信号。有一些方法可以防止这种情况中断您的系统调用,但通常您只需要:

      while (1) {
         ssize_t x = read(file, buf, len);
         if (x < 0) {
             if (errno == EINTR) {
                 errno = 0;
                 continue;
             } else {
                // it's a real error
      

      【讨论】:

        【解决方案3】:

        如果您收到EINTR,这可能意味着您安装了不正确的信号处理程序。当您简单地调用 signal 时,好的 unice 将默认使用可重启的系统调用,但为了安全起见,您应该使用 bsd_signal 函数(如果可用),或者使用可重启标志调用 sigaction 以避免 EINTR 的头痛.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-14
          相关资源
          最近更新 更多