如何在 Free Pascal 上为接口列表或其他 ioctl 调用 ioctl?
Posted
技术标签:
【中文标题】如何在 Free Pascal 上为接口列表或其他 ioctl 调用 ioctl?【英文标题】:How can I call ioctl for interface list, or other ioctl stuff, on Free Pascal? 【发布时间】:2013-08-20 04:29:03 【问题描述】:我一直在谷歌上搜索,在 Free Pascal Wiki 上搜索,甚至在一些(不知名的)邮件列表上搜索,但对于如何在 Free Pascal 上使用 ioctl()
或 fpioctl()
却一无所获。
我有这个来自 Free Pascal 的 Bugtrack 的 bug report,其中包含枚举网络接口的代码。
代码无法编译,因为 libc
单元已被弃用。
很多关于libc
的类似问题都指向这个wiki entry,它谈论它的消亡。
它不会告诉您SIOC*IF*
的去向。
这是否意味着ioctl
的大部分功能已经消失?
使用find
和grep
,在/usr/share/fpcsrc/fpioctl()
与termios
单元的终端相关的一些使用情况.其他东西使用它,但它看起来像是在其他操作系统下。
除此之外,如果您想做类似的事情,我找不到任何有用的东西:
if ioctl(sock, SIOCGIFCONF, @ifc)= 0 then begin
...
end;
那么,如果有人想在 Linux 下进行ioctl
调用,Free Pascal 社区的任何人都可以给我指点当前的情况吗?
【问题讨论】:
【参考方案1】: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.
【讨论】:
【参考方案2】:Fpioctl 位已由 Mick 和常见问题解答。至于常量,正如 libc 单元常见问题解答所解释的那样,没有明确的解决方案,因此对于更专业的常量,没有替代品。
操作系统特定的常量应该放在操作系统特定的单元(linux)中,并且(在某种程度上)可移植的常量通常与它们所针对的功能的调用组合在一起。
旧的 libc 标头是一个粗略的标头转换,经过了一些清理,仅适用于 32 位 Linux,但不适用于 nix 抽象甚至“仅”多平台 Linux。因此被放弃了。
简而言之,最好要么制作一个抽象相关部分的简单单元,要么只在本地定义常量。
【讨论】:
谢谢马可,这有帮助。有了米克的回答,它就完成了。以上是关于如何在 Free Pascal 上为接口列表或其他 ioctl 调用 ioctl?的主要内容,如果未能解决你的问题,请参考以下文章