从获得的FileDescriptor路径的Java(Get path from FileDescri

2019-09-22 03:54发布

一些背景知识对我的问题:

我正在写一个编译器,域类型强制规范转换成Java安全管理代码。 概括地说,DTE定义的“类型”(对象),分配路径的那些类型; 然后定义“结构域”(受试者),并且定义了什么权限(rwxdc)结构域具有各种类型。 我需要在JSM尽可能地模仿这种行为。

目前我正在写权限。 我已经成功地覆盖了JSM器的checkWrite(字符串文件名)方法。 其次在名单上是checkWrite(FileDescriptor的文件描述符),这是一个棘手的证明。 由于DTE的定义方式,我需要路径信息来确定写入操作是否是允许的。

  • 是否有可能从FileDescriptor的提取路径数据? 我猜没有 - 我检查的文件和各种教程,我发现没有任何证据表明有任何但是办法,我获得此信息(我很高兴能够显示错误的;那会让我的工作变得更轻松)。

  • 如果答案以上是NO,任何人都可以提出一个可行的解决方法吗? 例如,有一些方法我可以写本地代码做我想做什么,扎入我的自定义类JSM这个? 我很好做一些“先进”这样的,但我需要一些想法如何开始。

  • 或者是我唯一的选择基本上否认使用FileDescriptor的所有写权限? 我非常想避免这种情况,因为这是一个糟糕的解决方案,但如果这是我需要知道的现实。

非常感谢你花时间陪伴。

Answer 1:

简短的回答是否定的,因为文件是独立于用于访问(至少在这方面存在任何OS)该文件的路径。

一种可能的解决办法是捕获调用打开文件,使用方面的框架,并把引用的文件描述成WeakHashMap<FileDescriptor,File> 。 然后,你只需看这张图时,你需要验证的写操作。



Answer 2:

该解决方案摆脱的FileDescriptor在java中的路径:

这个怎么运作:

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

什么是文件描述符,深入浅出的解释呢?

如果我们知道描述符标识那么我们可以通过下面的Java代码可以轻松地查找文件的路径:

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中的一个目录中包含系统中运行的所有进程

/自当前运行的Java类进程id

/ FD文件描述符目录

// fd_id文件描述符ID

SafeFileDescriptor.java

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

/* 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.h SafeFileDescriptor.java

javac -h dir SafeFileDescriptor.java

取代“目录”与您的目录来存放SafeFileDescriptor.h

SafeFileDescriptor.c

#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

gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libSafeFileDescriptor.so SafeFileDescriptor.c

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

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


文章来源: Get path from FileDescriptor in Java