如何找到子进程的id?

时间:2014-10-23 22:13:39

标签: java

原始问题:我使用以下代码成功找到了进程的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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  

我希望得到子进程的id,在这里我相信我会通过查找InputStreamReader的id来实现它。

它不会起作用。

  • InputStreamReader没有ID。
  • 它包裹的InputStream也没有。
  • FileDescriptor内的InputStream

您的代码无法正常工作,因为读者或流都不会成为UNIXProcess的实例。

如果您需要子进程pid,则必须保留对Process对象的引用。