Network programming 如何在免费Pascal上调用接口列表的ioctl或其他ioctl内容?

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

我一直在谷歌上下搜索,在免费的Pascal Wiki上搜索,甚至在一些(模糊的)邮件列表上搜索,对于如何在免费Pascal上使用
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.