我正在尝试使用Java创建一个小程序来分叉两个新的子进程。对于初学者的编程课程来说,他们的教程是C语言,所以我正在寻找一些帮助来理解这段代码试图做什么以及最好的方法是什么使其适应基于Java的程序(最终以它为基础)。
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
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,在子进程执行时打印信息,并在终止时打印终止通知。我现在看到上面的这段代码列出了当前目录的内容并打印了#34; Child Complete&#34;当进程终止时整个目录的列表是否被视为一个进程?如果是这样,第二个新的子进程在哪里/如何进入图片?
答案 0 :(得分:4)
好吧,回答一下程序的作用:
当fork()执行时,您将获得两个进程。 它们执行完全相同的操作,除了其中一个(子)从fork()返回0,而父类从fork()获取任何其他正值。 fork()的否定返回意味着它失败了。
因此,通过查看fork()的返回值,进程可以确定它是child还是parent。 在您的情况下,让子进程执行“ls”命令,该命令列出当前目录中的文件。
您让父级wait()完成所有子进程。然后你说“儿童完成”。
您可以尝试删除wait()系统调用,以更清楚地看到这两个进程实际并发运行。 看一下ps(1),ls(1),fork(2)和exec(3)的手册页。
答案 1 :(得分:3)
在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();
}
}