首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java从FileDescriptor获取路径

用Java从FileDescriptor获取路径
EN

Stack Overflow用户
提问于 2012-09-05 16:03:33
回答 4查看 9.6K关注 0票数 4

关于我的问题的一些快速背景:

我正在编写一个编译器,它将域类型强制执行规范转换为Java安全管理器代码。简而言之,DTE定义“类型”(对象),为这些类型分配路径;然后定义“域”(subjects),并定义对各种类型的权限(rwxdc)。我需要在JSM中尽可能地模仿这种行为。

目前,我正在研究写权限。我已经成功地重写了JSM的checkWrite(String )方法。列表中的下一个是checkWrite(FileDescriptor filedescriptor),事实证明这个更棘手。由于DTE的定义方式,我需要路径信息来确定是否允许写操作。

  • 是否可以从FileDescriptor中提取路径数据?我猜没有--我已经检查了文档和各种教程,我没有发现有任何方法可以让我获得这些信息(不过,我很高兴看到错误的结果,这会使我的工作更容易)。
  • 如果上述答案是否定的,是否有人能提出可行的解决办法?例如,有什么方法可以编写本机代码来完成我想做的事情并将其绑定到我的自定义JSM类中吗?我可以做一些“高级”的事情,但我需要一些如何开始的想法。
  • 或者我唯一的选择基本上是拒绝所有使用FileDescriptor的写权限?我很想避免这一点,因为这是一个糟糕的解决方案,但如果这是我需要知道的现实。

非常感谢你抽出时间。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-05 17:24:38

简单来说,答案是否定的,因为一个文件独立于用于访问该文件的路径(至少在任何重要的操作系统上都是如此)。

一个可能的解决方法是使用方面框架捕获打开文件的调用,并将引用的文件描述符放入WeakHashMap<FileDescriptor,File>中。然后,每当需要验证写入时,您只需查看此映射即可。

票数 5
EN

Stack Overflow用户

发布于 2020-06-27 10:36:11

希望不会被反射限制所阻止,但是现在您可以使用这个(基于另一个答案的代码),从Android开始:

代码语言:javascript
复制
val file = File(filesDir, "ff")
file.parentFile!!.mkdirs()
val fileOutputStream = FileOutputStream(file)
val fd = fileOutputStream.fd
val method = fd.javaClass.getMethod("getInt$")
val fdId = method.invoke(fd)
val path = Paths.get("/proc/self/fd/$fdId")
val filePath = Files.readSymbolicLink(path)
Log.d("AppLog", "filePath:$filePath")

不过,对FileChannel并不确定。它的实现文件("FileChannelImpl")应该有“路径”(文件路径字符串类型)和"fd“,后者是FileDescriptor,但两者都是通过反射隐藏的。

票数 1
EN

Stack Overflow用户

发布于 2019-05-14 06:19:17

在java中从FileDescriptor获取路径的解决方案:

的工作方式:

我们知道文件描述符包含描述符id来定位当前进程中打开的文件。

What are file descriptors, explained in simple terms?

如果我们知道描述符id,那么我们可以很容易地通过以下java代码找到文件路径:

代码语言:javascript
复制
Path path = Paths.get("/proc/self/fd/"+fd_id);
System.out.println(Files.readSymbolicLink(path)); //return file path in file descriptor

在此:

fd_id文件描述符id (0,1,2 .) /proc its目录包含系统中运行的所有进程 当前运行java类进程id的/self /fd文件描述符目录 //fd_id文件描述符id

SafeFileDescriptor.java

代码语言:javascript
复制
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.nio.file.Path;  
public class SafeFileDescriptor {

 static {
    System.load("Documents/java native interface exmples/libSafeFileDescriptor.so");
}

private native int getFDid(FileDescriptor fd);

public static void main(String[] args) throws IOException{  
    FileOutputStream fout = new FileOutputStream("Documents/test.txt");
    FileDescriptor fd=fout.getFD();
    int fd_id = new SafeFileDescriptor().getFDid(fd);
    Path path = Paths.get("/proc/self/fd/"+fd_id);
    System.out.println(Files.readSymbolicLink(path));
}
}

getFDid()是一个本机方法,用于获取给定文件描述符对象的描述符id。

下面的代码是getFDid()本机方法的实现

SafeFileDescriptor.h

代码语言:javascript
复制
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SafeFileDescriptor */

#ifndef _Included_SafeFileDescriptor
#define _Included_SafeFileDescriptor
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     SafeFileDescriptor
 * Method:    getFDid
 * Signature: (Ljava/io/FileDescriptor;)I
 */
JNIEXPORT jint JNICALL Java_SafeFileDescriptor_getFDid
  (JNIEnv *, jobject, jobject);

#ifdef __cplusplus
}
#endif
#endif

从java文件SafeFileDescriptor.java创建SafeFileDescriptor.h

代码语言:javascript
复制
javac -h dir SafeFileDescriptor.java

用目录替换"dir“以存储SafeFileDescriptor.h

SafeFileDescriptor.c

代码语言:javascript
复制
#include <jni.h>
#include "SafeFileDescriptor.h"

JNIEXPORT jint JNICALL Java_SafeFileDescriptor_getFDid
  (JNIEnv *env, jobject this_object, jobject fdObject) {

    jclass fileDescriptor = (*env)->GetObjectClass(env,fdObject);

    jfieldID id_fd = (*env)->GetFieldID(env, fileDescriptor, "fd", "I");

    return (*env)->GetIntField(env,fdObject,id_fd);
}

编译SafeFileDescriptor.c

代码语言:javascript
复制
gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libSafeFileDescriptor.so SafeFileDescriptor.c

libSafeFileDescriptor.so文件添加到java类文件

代码语言:javascript
复制
System.load("Documents/java native interface exmples/libSafeFileDescriptor.so");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12285469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档