【问题标题】:How can I call ioctl for interface list, or other ioctl stuff, on Free Pascal?如何在 Free Pascal 上为接口列表或其他 ioctl 调用 ioctl?
【发布时间】: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 社区的任何人都可以给我指点当前的情况吗?

【问题讨论】:

    标签: network-programming kernel freepascal ioctl


    【解决方案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。因此被放弃了。

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

      【讨论】:

      • 谢谢马可,这有帮助。有了米克的回答,它就完成了。
      猜你喜欢
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2012-01-21
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      相关资源
      最近更新 更多