我想好好理解以下代码:
/* Become deamon + unstoppable and no zombies children (= no wait()) */
if(fork() != 0) return 0; /* Parent returns OK to shell */
signal(SIGCLD, SIG_IGN); /* ignore child death */
signal(SIGHUP, SIG_IGN); /* ignore terminal hangups */
for(i = 0; i < 32; i++) close(i); /* close open files */
setpgrp(); /* break away from process group */
Run Code Online (Sandbox Code Playgroud)
以下是我对上述代码的理解:
第1行:创建子进程并终止父进程,因此父进程将返回到shell,子进程将继续在后台执行该程序.
第二行:当子进程(执行程序的用户)终止时,忽略应该发送到父进程(谁控制终端)的信号.我觉得这条线会避免僵尸孩子的发生吗?
第3行:我读到它忽略了POSIX的挂断,我不确定它到底是什么.
第4行:关闭描述符文件为0到31的打开文件(我不知道为什么从0到31)
第5行:不知道它做了什么.
能帮我理解一下这段代码吗?提前致谢 :)
我想使用write(http://linux.about.com/library/cmd/blcmdl2_write.htm)将整数1写入第一个字节,将0x35写入文件描述符的第二个字节,但是当我发送时会收到以下警告尝试以下方法:
write(fd, 1, 1);
write(fd, 0x35, 1);
source.c:29: warning: passing argument 2 of ‘write’ makes pointer from integer without a cast
source.c:30: warning: passing argument 2 of ‘write’ makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud) Linux(Ubuntu)中有一个进程可以打开一个文件进行读取但不会故意关闭它.当进程终止时,操作系统是否自动关闭文件描述符?
我的具体情况是在Rails应用程序中,我打开一个二进制文件.我的Web服务器产生多个Rails进程.该文件在每个Rails进程中从单例打开.我需要知道当Rails进程终止时是否自动关闭此二进制文件.
如果你想用Bash覆盖一个文件,这很容易
echo "Hello world" > hosts
Run Code Online (Sandbox Code Playgroud)
这似乎不适用于文件描述符
$ exec 3<> hosts
$ echo "Hello world" >&3
$ cat hosts
Hello world
$ echo "Hello world" >&3
$ cat hosts
Hello world
Hello world
Run Code Online (Sandbox Code Playgroud) 如何获取系统中当前的文件描述符数?
我知道如何获得最大值.
% sysctl kern.maxfiles
kern.maxfiles: 8232
Run Code Online (Sandbox Code Playgroud)
参考:
这个问题在某种程度上类似于Bad文件描述符,但它根本不相同.我知道这是"糟糕的问题"(可能是"过于本地化"),但我无法理解,现在我已经没有任何想法.
我有一个经理线程,启动75个其他线程.这些线程中的每一个都做了很多事情,所以我只描述相关的线程.
请注意:如果我只启动几个线程 - 例如3或5或10,则不会出现此错误!这让我觉得,这是一些多线程问题,但它似乎并不是这样的.你会在下一节中看到原因.
所以,在以下2个案例中,有时我收到此错误Bad file descriptor:
错误出现在 TinyXML
有一个xml文件,所有线程都需要它.所有这些线程都TinyXML用于解析文件.所有这些线程都只使用此文件!(我知道这可以优化,但无论如何).
因此,导致Bad file descriptor错误的代码是:
// ...
// NOTE: this is LOCAL, other threads do NOT have access to it
TiXmlDocument doc;
doc.LoadFile( filename );
// and here's the LoadFile:
bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding )
{
//...
FILE* file = fopen( value.c_str (), "rb" );
if ( file )
{
// this IS …Run Code Online (Sandbox Code Playgroud) 我正在处理一些Python代码,这是从Apache调用的CGI脚本。
代码要做的第一件事是(我相信)尝试使用以下命令关闭stdin / stdout / stderr:
for fd in [0, 1, 2]:
try:
os.close(fd)
except Exception:
pass
Run Code Online (Sandbox Code Playgroud)
通常,这可以正常工作,但是,如果它们没有打开,则会出现“ python.exe已停止工作”,“导致程序无法正常工作的问题”错误消息(Win32异常)。
几个问题:
我公司有很多ui测试,可以在虚拟/真实设备上运行.运行一段时间之后测试随机崩溃,我认为这是文件描述符超出的结果:我用过
ls /proc/${PID}/fd | wc -l而lsof -p ${PID}
但它并没有帮助了很多-最lsof命令行的样子:
30015 u0_a104 678 sock 859560 socket:[859560]
30015 u0_a104 679 0000 0,8 4539 anon_inode:[eventpoll]
30015 u0_a104 680 0000 0,8 4539 anon_inode:[eventfd]
30015 u0_a104 681 0000 0,8 4539 anon_inode:[eventfd]
30015 u0_a104 682 0000 0,8 4539 anon_inode:[eventpoll]
30015 u0_a104 683 0000 0,8 4539 anon_inode:[eventfd]
30015 u0_a104 684 0000 0,8 4539 anon_inode:[eventpoll]
30015 u0_a104 685 0000 0,8 4539 anon_inode:[eventfd]
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否有任何android/java/linux instruments/utils找到泄漏源?
PS System.gc()没有帮助
我有一个任务,我在一个线程中等待连接并将它们转发到另一个线程.也许我有些误解,但为什么我不能在主线程中重新打开文件描述符?
非常简化的代码:
sub inthread {
$socket = new IO::Socket::INET ( ... );
# ...
while ( my $client = $socket->accept() ) {
#if i print STDOUT, (fileno $client); # there i'll get 4
push ( @shared, fileno $client);
}
}
sub mainthread {
if ( scalar @shared ) {
$fd = shift @shared;
# if i print (fileno $fd); # there i'll get 4
open my $f, "<&=$fd" or die " error $!"; ### error here: Can't open 4: Bad …Run Code Online (Sandbox Code Playgroud) 我正在研究一个bash脚本,试图弄清楚它的工作方式并可能对其进行修补。有问题的脚本是这个 cryptroot从负责在开机解密块设备Debian的脚本。不能完全在家中进行bash肯定会带来挑战。
我找到了这段代码,但不确定它是做什么的。
if [ -r /conf/conf.d/cryptroot ]; then
while read mapping <&3; do
setup_mapping "$mapping" 3<&-
done 3< /conf/conf.d/cryptroot
fi
Run Code Online (Sandbox Code Playgroud)
我的猜测是,它将读取每一行/conf/conf.d/cryptroot并将其传递给setup_mapping。但是我不太了解,以及的意义<&3,意义3&-以及作用3</conf/conf.d/cryptroot是什么?
当我从文件中读取行时,通常会执行以下操作:
while read LINE
do COMMAND
done < FILE
Run Code Online (Sandbox Code Playgroud)
在while循环中将的输出FILE定向到的位置read,COMMAND直到最后一行为止。
我也对重定向有所了解,例如,有时我会用它来重定向STDOUT和STDERR诸如此类/dev/null的东西。但是我不确定重定向的3含义。
根据tldp.org的介绍,在阅读了有关I / O重定向的更多知识之后,我已经接近答案了。
stdin,stdout和stderr的文件描述符分别为0、1和2。要打开其他文件,请保留描述符3到9。
因此3是“仅”对打开文件的引用,或:
...只是操作系统分配给打开文件以跟踪它的数字。考虑它是文件指针的简化类型。
因此,据我了解:
3< /conf/conf.d/cryptroot打开/conf/conf.d/cryptroot读取并将其分配给文件描述符3。read mapping <&3似乎是从读文件描述符3,它指向打开文件的第一行/conf/conf.d/cryptroot …