如何在Free Pascal上调用接口列表或其他ioctl物件的ioctl?
我一直在上下搜索,在Free Pascal Wiki上搜索,甚至在一些(隐蔽的)邮件列表上搜索,并且在Free Pascal上如何使用ioctl()
或fpioctl()
已经完全空白。如何在Free Pascal上调用接口列表或其他ioctl物件的ioctl?
我有这个bug report从Free Pascal的Bugtrack与枚举网络接口的代码。
由于libc
单位已被弃用,因此代码不能编译。
关于libc
很多类似的问题指向这wiki entry谈论它的消亡。
它没有给你任何迹象表明SIOC*IF*
的东西已经消失。
这是否意味着大部分ioctl
功能已经消失?
使用find
和grep
,在/ usr /共享/ fpcsrc/< FPC版本> /,我已经能够跟踪关系fpioctl()
一些使用与termios
单元的端子。其他的东西使用它,但它看起来像在其他操作系统下。
除此之外,我不能,如果你想要做的事就像找到任何使用的东西:
if ioctl(sock, SIOCGIFCONF, @ifc)= 0 then begin
{...}
end;
因此,可以从免费的Pascal社区谁能给我一个指针有什么现状如果有人想在Linux下做ioctl
调用?
BaseUnix.FpIOCtl
是否符合您的使用情况?看看BaseUnix documentation。我发现an example of using it here(转发如下)。
program testrpi;
{$mode objfpc}{$H+}
uses
baseUnix,
classes,
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
sysutils;
const
I2C_SLAVE = 1795;
var
buf : packed array [0..1] of char;
c : char;
devPath : string = '/dev/i2c-1';
handle : Cint;
iDevAddr : Cint = $04;
begin
try
handle := fpopen(devPath,O_RDWR);
fpIOCtl(handle, I2C_SLAVE, pointer(iDevAddr));
except
writeln('Error initalizing i2c');
halt;
end;
while true do begin
write('Enter digit 1-9:');
readln(c);
if (not(c in ['1'..'9'])) then begin
writeln('oops - try again');
continue;
end;
buf[0] := chr(ord(c) - ord('0'));
try
fpwrite(handle, buf, 1);
except
writeln('Error writing');
halt;
end; //try
buf[0] := #99;
sleep(10);
try
fpread(handle, buf, 1);
except
writeln('Error reading');
halt;
end; //try
writeln('buf=', ord(buf[0]));
end; //while
fpclose(handle);
end.
fpioctl位已被Mick和常见问题回答。至于常量,由于libc单元常见问题解释说明没有明确的解决方案,因此对于更专门化的常量,不存在替代。
特定于操作系统的常量应该放在操作系统特定的单元(linux)中,并且(某种程度上)可移植的常量通常与它们所用功能的调用分组在一起。
旧的libc头文件是一个粗略的头文件翻译,它有些被清理了,只能用于32位Linux,但对于nix抽象或甚至是“仅”多平台Linux不可用。因此它被放弃了。
总之,最好是制作一个简单的单元,抽象出相关的部分或者只是在本地定义常量。
感谢Marco,这有帮助。随着米克的回答,它使它完成。 –