Network programming 如何在免费Pascal上调用接口列表的ioctl或其他ioctl内容?
我一直在谷歌上下搜索,在免费的Pascal Wiki上搜索,甚至在一些(模糊的)邮件列表上搜索,对于如何在免费Pascal上使用Network programming 如何在免费Pascal上调用接口列表的ioctl或其他ioctl内容?,network-programming,kernel,freepascal,ioctl,Network Programming,Kernel,Freepascal,Ioctl,我一直在谷歌上下搜索,在免费的Pascal Wiki上搜索,甚至在一些(模糊的)邮件列表上搜索,对于如何在免费Pascal上使用ioctl()或fpioctl(),我一无所获 我从FreePascal的错误跟踪中得到了这一点,其中包含枚举网络接口的代码 由于libc单元已被弃用,代码无法编译。 关于libc的许多类似问题都指向这一点,即它的消亡。 如果*东西去了,它不会给你任何关于SIOC*的指示 这是否意味着大部分的ioctl功能都消失了 使用find和grep,在/usr/share/fpc
ioctl()
或fpioctl()
,我一无所获
我从FreePascal的错误跟踪中得到了这一点,其中包含枚举网络接口的代码
由于libc
单元已被弃用,代码无法编译。关于
libc
的许多类似问题都指向这一点,即它的消亡。如果*东西去了,它不会给你任何关于
SIOC*的指示
这是否意味着大部分的ioctl
功能都消失了
使用find
和grep
,在/usr/share/fpcsrc//下,我能够跟踪fpioctl()
与带有termios
单元的终端相关的一些用法。其他东西使用它,但它看起来像是在其他操作系统下
除此之外,如果你想做以下事情,我找不到任何有用的东西:
if ioctl(sock, SIOCGIFCONF, @ifc)= 0 then begin
{...}
end;
那么,如果有人想在Linux下执行ioctl
调用,免费Pascal社区的任何人都能给我一个指向当前情况的指针吗?BaseUnix.FpIOCtl是否符合您的用例?看一看这张照片。我发现(转载在下面)
fpioctl位已由Mick和常见问题解答解答。至于常数,正如libc单元常见问题解答所解释的,没有明确的解决方案,因此对于更专业的常数,没有替代品
特定于操作系统的常量应该放在特定于操作系统的单元(linux)中,(某种程度上)可移植的常量通常与它们所要调用的功能一起分组
旧的libc头是一个粗略的头翻译,经过了一定程度的清理,它只适用于32位Linux,但不适用于nix抽象,甚至“只是”多平台Linux。因此,它被放弃了
简而言之,最好是制作一个简单的单元来抽象相关部分,或者只是在本地定义常量。谢谢Marco,这很有帮助。有了米克的回答,它就完成了。
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.