关于如何将文件指针(FILE*fp)转换为文件描述符(intfd)?和文件指针fp指向的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android中FileDescriptor的实际系统
关于如何将文件指针 ( FILE* fp ) 转换为文件描述符 (int fd)?和文件指针fp指向的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android中FileDescriptor的实际系统文件描述符(如int)、bash – 如何将subshell的输出文件描述符重定向到父shell中的输入文件描述符?、C 语言之 fileno () 函数 -- 获取已经打开的文件的文件描述符(小技巧)、FD_SET 未将文件描述符放入集合中等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 如何将文件指针 ( FILE* fp ) 转换为文件描述符 (int fd)?(文件指针fp指向)
- Android中FileDescriptor的实际系统文件描述符(如int)
- bash – 如何将subshell的输出文件描述符重定向到父shell中的输入文件描述符?
- C 语言之 fileno () 函数 -- 获取已经打开的文件的文件描述符(小技巧)
- FD_SET 未将文件描述符放入集合中
如何将文件指针 ( FILE* fp ) 转换为文件描述符 (int fd)?(文件指针fp指向)
我有一个FILE*
,通过调用返回fopen()
。我需要从中获取文件描述符,以便对其进行调用fsync(fd)
。从文件指针获取文件描述符的函数是什么?
答案1
小编典典正确的功能是int fileno(FILE *stream)
。它可以在 中找到<stdio.h>
,并且是 POSIX 标准,但不是标准 C。
Android中FileDescriptor的实际系统文件描述符(如int)
有没有办法从Android的FileDescriptor对象获取系统文件描述符(套接字或文件号为int)?我想直接在JNI代码中访问文件描述符,而不使用任何Java包装器.
编辑:
我找到了getParcelFileDescriptorFD,并且FileDescriptor具有名为“ descriptor”的int字段,例如media / jni / android_media_MediaPlayer.cpp中的用法示例,func定义在frameworks / base / core / jni / android_util_Binder.cpp中,该字段本身在libcore / luni中/src/main/java/java/io/FileDescriptor.java
但这不是官方记录的API的一部分.有记录的“正确”方法吗?
解决方法:
dalvik / libcore /中的本机代码在java_io_FileDescriptor.c中使用jniGetFDFromFileDescriptor,但是您不应该自己调用它,因为它不是稳定的API.您可以复制&粘贴该代码,但您确实要在进行三思而后行.使用JNI访问实现细节只是在乞求您的代码将来被意外破坏!
更好的选择是:
>如果可以,将I / O保留在Java端.
>如果您必须在本机端执行I / O(如媒体播放器的情况),则将I / O保留在本机端:调用open(2)或该端的任何其他操作,将fd保留为int而不是弄乱FileDescriptor对象,如果将任何内容传递回Java,则传递int或您自己的对象(除了传递回本机代码外,无意将其用于其他任何事情).
这两个选择现在都可以使用,并且不会因您无法控制的Android实现细节的更改而被偶然破坏.
bash – 如何将subshell的输出文件描述符重定向到父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
编辑:
子shell运行一个写入STDOUT和& 3的黑匣子程序。
您可以做一个句柄舞蹈将原始标准输出移动到一个新的描述符,使标准输出可用于管道(从我的头顶部):
exec 3>&1 # creates 3 as alias for 1 run_in_subshell() { # just shortcut for the two cases below echo "This goes to STDOUT" >&3 echo "And this goes to THE OTHER FUNCTION" }
现在你应该可以写:
while read line; do process $line done < <(run_in_subshell)
但是<()结构是一个bashism。您可以用管道替换它
run_in_subshell | while read line; do process $line done
除了第二个命令也在subshell中运行,因为管道中的所有命令都执行。
C 语言之 fileno () 函数 -- 获取已经打开的文件的文件描述符(小技巧)
open 函数相关的: /* open 是系统调用 返回的是文件句柄 */
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
fopen 函数相关的: /* open 是 ANSIC 标准中的 C 语言库函数,在不同的系统中应该调用不同的内核 api */
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
函数说明:fileno () 用来取得参数 stream 指定的文件流所使用的文件描述词.
void clearerr(FILE *stream);
int feof(FILE *stream);
int ferror(FILE *stream);
int fileno(FILE *stream);
实例:
#include <stdio.h>
int main(int argc, char **argv)
{
FILE * fp;
int fd;
fp = fopen("/etc/passwd", "r");
fd = fileno(fp);
//等价于
//fd=open("etc/passwd",RD_ONLY);
printf("fd=%d\n", fd);
fclose(fp);
return 0;
}
FD_SET 未将文件描述符放入集合中
当您声明 fd_set current_sockets,ready_sockets;
时,这两个变量都未初始化。 man 2 select
是这样说的:
FD_ZERO()
This macro clears (removes all file descriptors from) set.
It should be employed as the first step in initializing a
file descriptor set.
但是您跳过了这个非可选步骤,因此您的 FD 集充满了随机垃圾。
此外,fd_set
结构的内容是未指定的,因此除了使用 FD_ISSET
之外,您不应期望能够通过任何方式理解它们。
今天关于如何将文件指针 ( FILE* fp ) 转换为文件描述符 (int fd)?和文件指针fp指向的分享就到这里,希望大家有所收获,若想了解更多关于Android中FileDescriptor的实际系统文件描述符(如int)、bash – 如何将subshell的输出文件描述符重定向到父shell中的输入文件描述符?、C 语言之 fileno () 函数 -- 获取已经打开的文件的文件描述符(小技巧)、FD_SET 未将文件描述符放入集合中等相关知识,可以在本站进行查询。
本文标签: