如何在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功能已经消失?

使用findgrep,在/ 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不可用。因此它被放弃了。

总之,最好是制作一个简单的单元,抽象出相关的部分或者只是在本地定义常量。

+0

感谢Marco,这有帮助。随着米克的回答,它使它完成。 –