作为我正在修改的 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/