在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”。我做错了什么?
答案 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