如何查找子进程的id



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

我想得到子进程的id,在这里我相信我可以通过找到InputStreamReader的id来实现。

这行不通。

  • InputStreamReader没有ID
  • 它所包装的InputStream也没有
  • 位于CCD_ 4内部的CCD_

您的代码将无法工作,因为读取器和流都不会是UNIXProcess的实例。

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