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

使用findgrep,在/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?的主要内容,如果未能解决你的问题,请参考以下文章

Free Pascal IDE 下载安装配置

易于与 Free Pascal 集成的数据挖掘库?

Free Pascal IDE 下载安装配置

free pascal的一个集合(set of)最多可放多少个整数?

Free Pascal初次体验(有亮点哦)

在 Delphi/Free Pascal 中:^ 是运算符还是仅表示指针类型?