1

我一直在谷歌上搜索,在 Free Pascal Wiki 上搜索,甚至在一些(晦涩的)邮件列表上搜索,但关于如何使用ioctl()fpioctl()在 Free Pascal 上的内容完全是空的。

我有这个来自 Free Pascal 的 Bugtrack 的错误报告,其中包含枚举网络接口的代码。

libc由于该单元已被弃用,因此代码无法编译。
很多类似的问题都libc指向这个wiki 条目,它谈论它的消亡。
它没有给你任何关于这些SIOC*IF*东西去哪里的迹象。

这是否意味着大部分ioctl功能已经消失?

使用findand grep,在 /usr/share/fpcsrc/<fpc-version>/ 下,我已经能够跟踪fpioctl()与该termios单元的终端相关的一些使用情况。其他东西使用它,但看起来它在其他操作系统下。

除此之外,如果您想做类似的事情,我找不到任何有用的东西:

if ioctl(sock, SIOCGIFCONF, @ifc)= 0 then begin
{...}
end;

那么,如果有人想ioctl在 Linux 下进行调用,Free Pascal 社区的任何人都可以给我一个指向当前情况的指针吗?

4

2 回答 2

1

BaseUnix.FpIOCtl符合您的用例吗?查看BaseUnix 文档。我在这里找到了一个使用它的例子(在下面重新发布)。

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.
于 2016-02-21T22:44:45.390 回答
1

Fpioctl 位已由 Mick 和常见问题解答。至于常量,正如 libc unit faq 解释的那样,没有明确的解决方案,因此对于更专业的常量,没有替代品。

特定于操作系统的常量应该放在特定于操作系统的单元(linux)中,并且(在某种程度上)可移植的常量通常与它们所针对的功能的调用组合在一起。

旧的 libc 标头是一个粗略的标头转换,经过了一些清理,仅适用于 32 位 Linux,但不适用于 nix 抽象甚至“仅”多平台 Linux。因此被放弃了。

简而言之,最好要么制作一个抽象相关部分的简单单元,要么只在本地定义常量。

于 2016-02-24T14:51:22.103 回答