GNAT Ada中的ioctl TIOCGWINSZ返回错误25,但C程序工作正常

时间:2015-01-12 13:07:55

标签: c ada ioctl gnat

在Mac OS X 10.9.5上...

我正在尝试使用ioctl C-function获取屏幕大小

#include <sys/ioctl.h>
#include <stdio.h>
int main(int argc, char **argv)
{
  struct winsize sz;

  ioctl(0, TIOCGWINSZ, &sz);
  printf("Screen width: %i  Screen height: %i\n", sz.ws_col, sz.ws_row);
  return 0;
}

工作正常,

bash-3.2$ cc screen_size.c
bash-3.2$ ./a.out
Screen width: 167  Screen height: 40

但是当我尝试在Ada中做同样的事情时,我得到了errno=25

with Interfaces; use Interfaces;
with Interfaces.C; use Interfaces.C;
with Ada.Text_IO; use Ada.Text_IO;

procedure Screen_Size is

   TIOCGWINSZ : unsigned_long := 16#5413#;

   type winsize is
      record
         ws_row : unsigned_short;
         ws_col : unsigned_short;
         unused1 : unsigned_short;
         unused2 : unsigned_short;
      end record;
   pragma Pack(winsize);

   function ioctl (Fildes : in int; Request : in unsigned_long; ws : in out winsize) return int;
   pragma import(C, ioctl, "ioctl");

   Err_No : Integer;
   pragma Import (C, Err_No, "errno");

   ws : winsize;
   result : int;
   begin
   result := ioctl(0, TIOCGWINSZ, ws);
   if result = 0 then
      Put_Line ("Screen width: " & ws.ws_row'Img & " Screen height: " & ws.ws_col'Img);
   else
      Put_Line ("Err_No: " & Err_No'Img);
   end if;
end Screen_Size;

结果:

bash-3.2$ gnatmake screen_size.adb
gcc -c screen_size.adb
gnatbind -x screen_size.ali
gnatlink screen_size.ali
bash-3.2$ ./screen_size
Err_No:  25

如上所述,errno 25 (ENOTTY)表示“设备不适当的ioctl”。我做错了什么?

3 个答案:

答案 0 :(得分:0)

在我的计算机上,man ioctl表示ioctl的参数配置文件为int ioctl(int d, int request, ...);即,request应该是int,而不是unsigned_long,就像绑定一样

答案 1 :(得分:0)

如果我没记错的话,你不能直接从Ada用不确定数量的参数调用C函数。

通常的过程是创建一个C包装器,它接受固定数量的参数,然后绑定到它。另一种方法是查找C如何确定调用中的实际参数数量,并在绑定中模拟该参数。 (我怀疑你传递的最后一个参数必须是空指针/ System.Null_Address。)

答案 2 :(得分:0)

我解决问题。我发现了不好的TIOCGWINSZ值。正确的值是1074295912