Играем с системными вызовами из Java
Я попробовал простой способ сделать системный вызов из Java:
package ru.yamakarov.examples;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class JnaExample {
public interface CStdLib extends Library {
int syscall(int number, Object... args);
}
public static void main(String[] args) {
CStdLib c = (CStdLib)Native.loadLibrary("c", CStdLib.class);
// WARNING: These syscall numbers are for x86 only
System.out.println("PID: " + c.syscall(20));
System.out.println("UID: " + c.syscall(24));
System.out.println("GID: " + c.syscall(47));
c.syscall(136, "/tmp/create-new-directory-here");
}
}
Для этого достаточно подключить JNA:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.1</version>
</dependency>
И получить такой результат:
PID: 4816
UID: 502
GID: 20
Коды для системных вызовов на моей Macos я нашел по наводке в файле /usr/include/sys/syscall.h
.
JNA вообще говоря медленный по сравнению из JNI из-за своей динамичности. Однако для экспериментов с системными вызовами очень круто и удобно. Пока не знаю зачем мне может пригодитья этот инструмент, но выглядит забавно.