我想在os x(10.9.1)的进程中获取一个打开文件的列表.在Linux中我能够从中获得/proc/PID/fd.但是我不确定如何在OS X上获得相同的结果.我发现OS X上没有procfs(默认情况下.可能的实现存在,但我不想那样).
那么我如何(在本机上)获取OS X上进程中打开文件的列表.一种方法是lsof.有没有其他支持?请告诉我在哪里可以获得更多相关信息.
谢谢.
是否有可移植的方式(POSIX)来获取当前进程的最高分配文件描述符号?
我知道在AIX上有一个很好的方法来获取数字,但我正在寻找一种可移植的方法.
我问的原因是我想要关闭所有打开的文件描述符.我的程序是一个以root用户身份运行的服务器,为非root用户分叉和执行子程序.在子进程中保留特权文件描述符是一个安全问题.有些文件描述符可能是由我无法控制的代码(C库,第三方库等)打开的,所以我不能依赖它们FD_CLOEXEC.
我有一个文件描述符存储在变量say var.如何在稍后阶段检查该描述符是否有效?
fdvar1= open(.....);
fdvar2 = fdvar1; // Please ignore the bad design
....
// lots of loops , conditionals and threads. It can call close(fdvar2) also.
....
if(CheckValid(fdvar1)) // How can I do this check ?
write(fdvar1, ....);
Run Code Online (Sandbox Code Playgroud)
现在我想检查var1(仍保留打开的描述符)是否仍然有效.任何API都是为了什么?
我正在通过一个连续程序,我观察到他们在使用select()之前使用read().为什么这是必需的.为什么我们不能直接调用read()并检查它是否失败?另外,为什么我必须将文件描述符增加1并在我传递文件描述符集时传递它select()?
例:
r=select(fd+1, &fds, NULL, NULL, &timeout);
其中fds已经具有fd的值
当我启动Apache Bench测试时:
ab -n 10000 -c 1300 http://domain.com/test.php
我收到错误:
socket:打开的文件太多(24)
当我改为'-c 1000'时它工作正常.
因为我可以有超过1000个并发用户,我想修复socket太多打开文件问题或增加参数.怎么做到这一点?
我在centos 5上使用lighttpd.
有没有办法在原始文件描述符而不是FILE*上执行ftell()所做的操作(返回文件中的当前位置)?我认为应该有,因为你可以使用lseek()在原始文件描述符上寻找.
我知道我可以使用fdopen()创建一个对应于文件描述符的FILE*,但我宁愿不这样做.
在"Unix环境中的高级编程",第2版,作者:W.Richard Stevens.
第8.3节fork函数.
这是描述:
父和子共享相同的文件偏移量很重要.
考虑一个分叉孩子的过程,然后等待孩子完成.假设两个进程都写入标准输出作为其正常处理的一部分.如果父级的标准输出重定向(可能是shell),则当子级写入标准输出时,子级必须更新父级的文件偏移量.
[1.这是什么意思?例如,如果父项的std输出被重定向到'file1',那么子项写入后子项应该更新什么?parent的原始std输出偏移量或重定向输出(即file1)偏移量?不能晚了,对吧?
[2.更新是如何完成的?由子显式,由OS隐式地,由文件描述符本身?在fork之后,我认为父母和孩子走自己的路,并拥有自己的文件描述符COPY.那么孩子如何更新偏移到父方?]
在这种情况下,孩子可以在父母等待时写入标准输出; 在孩子完成后,父母可以继续写入标准输出,知道其输出将附加到孩子写的任何内容.如果父级和子级没有共享相同的文件偏移量,则此类交互将更难以完成,并且需要父级的显式操作.
如果父节点和子节点都写入相同的描述符,而没有任何形式的同步,例如让父节点等待子节点,则它们的输出将被混合(假设它是在fork之前打开的描述符).虽然这是可能的,但这不是正常的操作模式.
在fork之后处理描述符有两种正常情况.
父母等待孩子完成.在这种情况下,父级不需要对其描述符执行任何操作.当子进程终止时,子进程读取或写入的任何共享描述符将相应地更新其文件偏移量.
父母和孩子都有自己的方式.这里,在fork之后,父关闭它不需要的描述符,并且子进行相同的操作.这样,既不会干扰对方的开放描述符.网络服务器经常出现这种情况."
[3.当调用fork()时,我理解的是那个子得到了父有什么的COPY,在这种情况下是文件描述符,并做了它的事情.如果任何偏移更改为父和子共享的文件描述符,则只能因为描述符记住偏移本身.我对吗?]
对不起,我对这些概念不太了解.
有帮助吗?谢谢.
我正在开发一个视频流应用程序,并且在使用FileDescriptor调用set setDataSource时遇到困难.我希望我的应用程序在下载时播放视频,所以一旦我得到最小字节数,我将这些字节移动到另一个文件,这样它就可以在原始文件中下载时在另一个文件中播放.
所以,我检查一下我是否可以像这样启动每个数据包的媒体:
if (mediaPlayer == null) {
// Only create the MediaPlayer once we have the minimum
// buffered data
if (totalKbRead >= INTIAL_KB_BUFFER) {
try {
startMediaPlayer();
} catch (Exception e) {
Log.e(getClass().getName(),
"Error copying buffered conent.", e);
}
}
} else if (mediaPlayer.getDuration()
- mediaPlayer.getCurrentPosition() <= 1000) {
transferBufferToMediaPlayer();
}
}
Run Code Online (Sandbox Code Playgroud)
这是startMediaPlayer方法代码:
private void startMediaPlayer() {
try {
File bufferedFile = new File(context.getCacheDir(), "playingMedia"
+ (counter++) + ".dat");
// bufferedFile is the one that'll be played
moveFile(downloadingMediaFile, …Run Code Online (Sandbox Code Playgroud) 我正在尝试启动resque-web,但是会发生以下错误:
[Sun Mar 06 05:27:48 +0000 2011] Starting 'resque-web'... [Sun Mar 06 05:27:48 +0000 2011] trying port 8281... Couldn't get a file descriptor referring to the console
Ubuntu 10.04和10.10发生此错误.
Resque Web仅以-F选项开头(不要守护进程,在前台运行).因此,当进程被守护时,它必须是某种东西.
任何想法,我该如何解决?
问候,
(在BASH中)我希望子shell使用非STDOUT非STDERR文件描述符将一些数据传递回父shell.我怎样才能做到这一点?最终我希望将数据保存到父shell的某个变量中.
(
# The following two lines show the behavior of the subshell.
# We cannot change them.
echo "This should go to STDOUT"
echo "This is the data I want to pass to the parent shell" >&3
)
#...
data_from_subshell=... # Somehow assign the value of &3 of the
# subshell to this variable
Run Code Online (Sandbox Code Playgroud)
编辑:子shell运行一个写入STDOUT和&3的黑盒程序.
file-descriptor ×10
c ×3
linux ×3
android ×1
apache ×1
bash ×1
file-pointer ×1
fork ×1
ftell ×1
gcc ×1
lighttpd ×1
macos ×1
media-player ×1
posix ×1
procfs ×1
resque ×1
scalability ×1
shell ×1
unix ×1