使C fork代码适应Java程序

我正在尝试使用Java创建一个小程序来分叉两个新的子进程。 这是一个初学者的编程类,他的教程是C语言,所以我正在寻找一些帮助来理解这个代码的目标是什么,以及将它适应基于Java的程序的最佳方法是什么(最终建立在它)。

#include  #include  #include  int main() { pid t pid; /*fork a child process*/ pid = fork(); if (pid < 0) { /*error occurred*/ fprintf(stderr, "Fork Failed"); return 1; } else if (pid == 0) {/*child process */ execlp("/bin/ls", "ls", NULL); } else { /*parent process*/ /*parent will wait for the child to complete */ wait(NULL); printf("Child Complete"); } return 0; } 

更新:

我应该为每个子进程及其父进程附加一个id,在子进程执行时打印信息,并在终止时打印终止通知。 我现在看到上面的这段代码列出了当前目录的内容,并在进程终止时打印“Child Complete”。 整个目录的列表是否被视为一个进程? 如果是这样,第二个新的子进程在哪里/如何进入图片?

在Java中,这可能看起来像 –

 public static void main(String[] args) { try { Process p = Runtime.getRuntime().exec("/bin/ls"); final InputStream is = p.getInputStream(); Thread t = new Thread(new Runnable() { public void run() { InputStreamReader isr = new InputStreamReader(is); int ch; try { while ((ch = isr.read()) != -1) { System.out.print((char) ch); } } catch (IOException e) { e.printStackTrace(); } } }); t.start(); p.waitFor(); t.join(); System.out.println("Child Complete"); } catch (Exception e) { e.printStackTrace(); } } 

那么,回答程序的作用:

当fork()执行时,您将获得两个进程。 它们执行完全相同的操作,除了其中一个(子)从fork()返回0,而父类从fork()获取任何其他正值。 fork()的否定返回意味着它失败了。

因此,通过查看fork()的返回值,进程可以确定它是child还是parent。 在您的情况下,您让子进程执行“ls”命令,该命令列出当前目录中的文件。

您让父级wait()完成其所有子进程。 然后你说“儿童完成”。

您可以尝试删除wait()系统调用,以更清楚地看到这两个进程实际并发运行。 看一下ps(1),ls(1),fork(2)和exec(3)的手册页。