linux - stat() 系统函数在 Linux 7.6 中不起作用

标签 linux cobol microfocus

作为我正在修改的 Cobol 程序的一部分,需要调用 stat 函数来检索文件的详细信息。这是在 Linux 7.6 中。但是当我运行程序时,我得到了错误

加载错误:文件“stat” 错误代码: 173, pc=C6, call=1, seg=0 173 在驱动器/目录中找不到调用的程序文件

如果我从命令行对文件使用 stat,它会起作用并且会检索到详细信息。我不明白为什么从 cobol 调用 stat 失败。

我检查了/usr/lib 中 .so 文件中的统计信息。可以在 libc_nonshared.a 中找到 stat

还尝试在更改 stat 结构后将调用从 stat 更改为 stat64。 stat64 也会抛出同样的错误。

有没有其他人遇到过这个问题。任何向前推进的指示都会有很大帮助。

       R0001.
          DISPLAY 'Program STARTED'
          ACCEPT WS-FILENAME2 FROM COMMAND-LINE
          MOVE 00025  TO FCD-NAME-LENGTH
          MOVE x'00'                 TO WS-FILENAME2(FCD-NAME-LENGTH:1)
          DISPLAY 'FILENAME : ' WS-FILENAME2
          CALL 'stat' USING WS-FILENAME2
                            ST-BUF
               RETURNING WS-RETURN-CODE.
          DISPLAY 'STAT CALL COMPLETE'
          DISPLAY 'RETURN CODE: ' WS-RETURN-CODE
          IF WS-RETURN-CODE NOT = ZERO
             SET GNIO-RC-ERR-DATEXT TO TRUE
             GO TO R0099
          END-IF.
          DISPLAY 'DEVICE VALUE : ' ST-DEV-LINUX
          DISPLAY 'INODE VALUE  : ' ST-INO64-LINUX
          DISPLAY 'ATIME        : ' ST-ATIME-LINUX
          DISPLAY 'CTIME        : ' ST-CTIME-LINUX
          DISPLAY 'MTIME        : ' ST-MTIME-LINUX
          DISPLAY 'SIZE64       : ' ST-SIZE64-LINUX
          DISPLAY 'BLOCKS64     : ' ST-BLOCKS64-LINUX.
       R0099.
          EXIT.
          STOP RUN.

加载错误:文件“stat” 错误代码: 173, pc=C6, call=1, seg=0 173 在驱动器/目录中找不到调用的程序文件

最佳答案

我能够让它运行,但只有在首先将 COBOL 中的结构拼凑在一起之后。强制静态调用后,在编译时链接到系统库中。

这是我从名为 callstat2 的程序中获得的信息:

   01 ST-STRUCT.
      05  ST-DEV-LINUX             PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-INO64-LINUX           PIC 9(9) COMP-5.
      05                           pic x(4).
      05  ST-NLINK                 PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-MODE                  PIC 9(9) COMP-5.
      05  ST-UID                   PIC 9(9) COMP-5.
      05  ST-GUID                  PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-RDEV-LINUX            PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-SIZE                  PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-BLOCKSIZE-LINUX       PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-BLOCKS                PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-ATIME-LINUX           PIC 9(10) COMP-5.
      05                           PIC 9(10) COMP-5.
      05  ST-MTIME-LINUX           PIC 9(10) COMP-5.
      05                           PIC 9(10) COMP-5.
      05  ST-CTIME-LINUX           PIC 9(10) COMP-5.


      CALL STATIC 'stat' USING WS-FILENAME2
                               ST-STRUCT 
                     RETURNING WS-RETURN-CODE
      END-CALL

使用 -L 开关编译。

cobc -x  callstat2.cob -L/usr/lib/x86_64-linux-gnu

附言。 callstat1 也能正常工作,但它使用 C 模块包装器对 stat 和 ctime 进行系统调用。

关于linux - stat() 系统函数在 Linux 7.6 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57376479/

相关文章:

cobol - 编写从单独的 vsam 文件中提取信息的 Cobol 程序时遇到问题

Java null 取消引用 - 微焦点安全漏洞

Linux:用指定的数据覆盖文件夹中的所有文件?

java - 使用 Android 确定 IP 地址是 STATIC 还是 DHCP?

regex - sed 用特殊字符替换字符串

linux - Mercurial 差异 merge : What tool is this and how do I use it?

cobol - 函数 ord 有时有效但有时无效

file - 如何检查文件是否已在 COBOL 中打开?

cmake - 将 Fortify sourceanalyzer 与 CMake 结合使用