背景:我正在尝试仅使用“Git for windows”附带的工具创建一个伪终端,因此如果 XYZ 需要额外的本机二进制文件,请不要告诉我“只需安装工具 XYZ”。 (实际上,请随意提及 XYZ,因为它可能对其他人有用,但可能对我没有帮助。)
抛开这个背景,这个问题的其余部分实际上假设我们在 Linux 上,因为 Linux 有 strace,而没有 strace 我就活不下去。
所以,考虑这个代码片段...
open PTMX, '/dev/ptmx';
my $out = "1234"; # is this right??
my $ret = ioctl PTMX, 0x5430, $out; # hardcode number for now
if (!$ret) {
say "errno is $!"
} else {
say "out is $out; ret is $ret"
}
当我使用
strace -e ioctl /usr/bin/perl t.pl
运行此命令时,我看到了
因此我得出结论,问题出在第三个参数上。 在 C 级别,我想传递一个指向整数的指针,但我无法从 https://perldoc.perl.org/functions/ioctl 的文档中弄清楚如何做到这一点。
您可以安装 Cygwin,而不是安装“Git for Windows”。它提供了与“Git for Windows”使用的 MSYS 提供的类似的 unix 模拟环境。与 MSYS 相比,使用 Cygwin 的优势在于它配备了(储备充足的)包管理器,可让您轻松添加更多工具。
对于您的问题,文档对第三个参数(“SCALAR”)进行了如下说明:
指向 SCALAR 字符串值的 C 指针将作为实际 ioctl 调用的第三个参数传递。
因此第三个参数需要是包含“packed”参数的字符串。
我发现了一个 FreeBSD 手册页,上面写着
pts 实现还支持 TIOCGPTN ioctl(2) 调用,该调用将指向无符号 int 的指针作为参数并提供 pty 的编号。
这建议执行以下程序:
use constant TIOCGPTN => 0x5430;
my $ptmx_qfn = "/dev/ptmx";
open( my $ptmx_fh, "<", $ptmx_qfn )
or die( "Can't open `$ptmx_qfn`: $!\n" );
my $buf = pack( "I", 0 ); # Allocate space
ioctl( PTMX, TIOCGPTN, $buf )
or die( "Can't get pty number: $!" );
my $num = unpack( "I", $buf );