小编sev*_*nup的帖子

close()x86_64系统调用奇怪的返回值

内核升级后,我的xinetd守护进程突然停止工作(从2.6.24到2.6.33).我跑了一个strace,发现了这个:

[...]
close(3)                                = 0
munmap(0x7f1a93b43000, 4096)            = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=8*1024, rlim_max=16*1024}) = 0
setrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
close(3)                                = 4294967287
exit_group(1)                           = ?
Run Code Online (Sandbox Code Playgroud)

所以基本上,看起来close系统调用返回的东西不同于0或-1

我做了几次测试,看起来它只发生在64位可执行文件中:

$ file closetest32
closetest32: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped
$ strace closetest32
execve("./closetest32", ["closetest32"], [/* 286 vars */]) = 0
[ Process PID=4731 runs in 32 bit mode. ]
open("/proc/mounts", O_RDONLY)          = 3
close(3)                                = 0
close(3)                                = -1 EBADF (Bad file descriptor)
_exit(0)                                = …
Run Code Online (Sandbox Code Playgroud)

c kernel x86-64 system-calls

16
推荐指数
1
解决办法
790
查看次数

标签 统计

c ×1

kernel ×1

system-calls ×1

x86-64 ×1