从关闭的文件描述符中读取
Reading from a Closed File Descriptor
我使用 strace
在 gimp-2.8.22
中跟踪了 open
、read
、close
和 dup
系统调用,使用以下命令:
strace -eread,openat,open,close,dup,dup2 gimp
在gimp
中,我打开了一张名为babr.jpg
的图片。跟踪显示此图像已打开(文件描述符为 14
)、读取并关闭。但是,紧接着,相同的文件描述符(14
在上次关闭后未打开)用于读取。这怎么可能?
这是跟踪的相关部分:
read(14, "113M1j1b1205d40y6736(40x23S224"..., 4096) = 4096
read(14, "t05fv<3.5A41+75&+rL7362633'6"..., 4096) = 318
close(14) = 0
openat(AT_FDCWD, "/home/ahmad/Pictures/babr.jpg", O_RDONLY) = 14
read(14, "7070[=11=]JFIF[=11=],,[=11=][=11=]75(2Photosho"..., 4096) = 4096
close(14) = 0
openat(AT_FDCWD, "/opt/gimp-2.8.22/lib/gimp/2.0/plug-ins/file-jpeg", O_RDONLY) = 19
read(19, "7ELF[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]>[=11=][=11=][=11=][=11=]P[[=11=][=11=][=11=][=11=][=11=][=11=]"..., 4096) = 4096
close(19) = 0
close(20) = 0
read(19, "", 8) = 0
close(19) = 0
close(17) = 0
close(16) = 0
read(4, "[=11=][=11=][=11=][=11=][=11=][=11=][=11=]", 16) = 8
Gtk-^[[1;32mMessage^[[0m: ^[[34m15:09:02.956^[[0m: Failed to load module "canberra-gtk-module"
read(14, "[=11=][=11=][=11=]", 4) = 4
read(14, "[=11=][=11=][=11=]", 4) = 4
read(14, "gimp-progress-init[=11=]", 19) = 19
read(14, "[=11=][=11=][=11=]", 4) = 4
我也用 Pin
检查了这个,发现了相同的结果。
第二个文件描述符 #14 很可能是插件和 Gimp 之间的管道(空闲的句柄已被重用)。而且您不会跟踪管道的创建。
来自gimpplugin.c
:
/* Open two pipes. (Bidirectional communication).
*/
if ((pipe (my_read) == -1) || (pipe (my_write) == -1))
{
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
"Unable to run plug-in \"%s\"\n(%s)\n\npipe() failed: %s",
gimp_object_get_name (plug_in),
gimp_file_get_utf8_name (plug_in->file),
g_strerror (errno));
return FALSE;
}
我使用 strace
在 gimp-2.8.22
中跟踪了 open
、read
、close
和 dup
系统调用,使用以下命令:
strace -eread,openat,open,close,dup,dup2 gimp
在gimp
中,我打开了一张名为babr.jpg
的图片。跟踪显示此图像已打开(文件描述符为 14
)、读取并关闭。但是,紧接着,相同的文件描述符(14
在上次关闭后未打开)用于读取。这怎么可能?
这是跟踪的相关部分:
read(14, "113M1j1b1205d40y6736(40x23S224"..., 4096) = 4096
read(14, "t05fv<3.5A41+75&+rL7362633'6"..., 4096) = 318
close(14) = 0
openat(AT_FDCWD, "/home/ahmad/Pictures/babr.jpg", O_RDONLY) = 14
read(14, "7070[=11=]JFIF[=11=],,[=11=][=11=]75(2Photosho"..., 4096) = 4096
close(14) = 0
openat(AT_FDCWD, "/opt/gimp-2.8.22/lib/gimp/2.0/plug-ins/file-jpeg", O_RDONLY) = 19
read(19, "7ELF[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]>[=11=][=11=][=11=][=11=]P[[=11=][=11=][=11=][=11=][=11=][=11=]"..., 4096) = 4096
close(19) = 0
close(20) = 0
read(19, "", 8) = 0
close(19) = 0
close(17) = 0
close(16) = 0
read(4, "[=11=][=11=][=11=][=11=][=11=][=11=][=11=]", 16) = 8
Gtk-^[[1;32mMessage^[[0m: ^[[34m15:09:02.956^[[0m: Failed to load module "canberra-gtk-module"
read(14, "[=11=][=11=][=11=]", 4) = 4
read(14, "[=11=][=11=][=11=]", 4) = 4
read(14, "gimp-progress-init[=11=]", 19) = 19
read(14, "[=11=][=11=][=11=]", 4) = 4
我也用 Pin
检查了这个,发现了相同的结果。
第二个文件描述符 #14 很可能是插件和 Gimp 之间的管道(空闲的句柄已被重用)。而且您不会跟踪管道的创建。
来自gimpplugin.c
:
/* Open two pipes. (Bidirectional communication).
*/
if ((pipe (my_read) == -1) || (pipe (my_write) == -1))
{
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
"Unable to run plug-in \"%s\"\n(%s)\n\npipe() failed: %s",
gimp_object_get_name (plug_in),
gimp_file_get_utf8_name (plug_in->file),
g_strerror (errno));
return FALSE;
}