原始问题:我使用以下代码成功找到了进程的pid。我希望获得子进程的id,在这里我相信我会通过查找InputStreamReader的id来实现它。但是,我没有以正确的方式解决这个问题,因为我无法确定我的代码的哪一部分会正确返回子进程的ID。
更新和更多信息:我的目标是跟踪父进程ID,宣布创建一个子进程及其ID和父ID。最后,宣布终止子进程。
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
class processes {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("/bin/ls");
final InputStream is = p.getInputStream();
final InputStream was = p.getInputStream();
Thread t = new Thread(new Runnable() {
public void run() {
InputStreamReader isr = new InputStreamReader(is);
InputStreamReader wasr = new InputStreamReader(was);
int isid = 0;
int ch;
if(isr.getClass().getName().equals("java.lang.UNIXProcess")) {
/* get the PID on unix/linux systems */
try {
Field i = isr.getClass().getDeclaredField("pid");
i.setAccessible(true);
isid = i.getInt(isr);
System.out.println("is process");
}
catch (Throwable e) {
}
}
try {
System.out.println(isid);
while ((ch = isr.read()) != -1) {
System.out.print((char) ch);
while ((ch = wasr.read()) != -1) {
System.out.print((char) ch);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
t.start();
p.waitFor();
t.join();
int pid = 0;
//final int isid = 0;
//int isid = 0;
if(p.getClass().getName().equals("java.lang.UNIXProcess")) {
/* get the PID on unix/linux systems */
try {
Field f = p.getClass().getDeclaredField("pid");
f.setAccessible(true);
//i.setAccessible(true);
pid = f.getInt(p);
//isid = i.getInt(is);
}
catch (Throwable e) {
}
}
System.out.println("Process p " + pid + " terminates.");
//System.out.println(pid);
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
我希望得到子进程的id,在这里我相信我会通过查找InputStreamReader的id来实现它。
它不会起作用。
InputStreamReader
没有ID。InputStream
也没有。FileDescriptor
内的InputStream
。您的代码无法正常工作,因为读者或流都不会成为UNIXProcess的实例。
如果您需要子进程pid,则必须保留对Process
对象的引用。