2012-09-07 75 views
6

我的问题是:为什么我的进程不能同时运行?

1.)我怎样才能让父进程总是最后死去?我知道这是没有完成的,因为父母是第一个运行的pid,但我不知道如何改变它。

2.)我如何让我的子进程与他同时执行?我甚至把这个数字看得很高,看看它是不是巧合,但它似乎不是。

编辑:SOLUTIONS

1)加入等待(NULL)在两次内默认
2.)发生了什么。用睡眠(1)来证明它。

我的代码如下

#include <stdio.h> 
int main() { 
    int pid, i; 
    pid = fork(); 
    switch(pid) { 
     case -1: 
      // error 
      printf("Fork error"); 
      break; 
     case 0: 
      // child process 
      printf("First child is born, my pid is %d\n", getpid()); 
      for(i=1; i<10; i++) 
       printf("First child executes iteration %d\n", i); 
      printf("First child dies quietly.\n"); 
      break; 
     default: 
      // parent process 
      printf("Parent process is born, my pid is %d\n", getpid()); 
      pid = fork(); 
      switch(pid) { 
       case -1: 
        // error 
        printf("Fork error"); 
        break; 
       case 0: 
        // child process 
        printf("Second child is born, my pid is %d\n", getpid()); 
        for(i=1; i<10; i++) 
         printf("Second child executes iteration %d\n", i); 
        printf("Second child dies quietly.\n"); 
        break; 
       default: 
        // parent process 
        printf("Parent process dies quietly."); 
     } 
    } 
    return 0; 
} 

我总是输出看起来像这样:

 
Parent process is born, my pid is 7847 
First child is born, my pid is 7848 
First child executes iteration: 1 
First child executes iteration: 2 
First child executes iteration: 3 
First child executes iteration: 4 
First child executes iteration: 5 
First child executes iteration: 6 
First child executes iteration: 7 
First child executes iteration: 8 
First child executes iteration: 9 
First child executes iteration: 10 
First child dies quietly. 
Parent process dies quietly. 
Second child is born, my pid is 7849 
Second child executes iteration 1 
Second child executes iteration 2 
Second child executes iteration 3 
Second child executes iteration 4 
Second child executes iteration 5 
Second child executes iteration 6 
Second child executes iteration 7 
Second child executes iteration 8 
Second child executes iteration 9 
Second child executes iteration 10 
Second child dies quietly. 

我的任务是:

编写一个C语言程序( “procs.c”),其创建三个进程:创建两个子进程的父进程。

的第一个孩子应该做到以下几点:

  • 显示“第一个孩子出生后,我的pid是......”

  • 显示十倍的消息“第一个孩子来执行迭代X” ,其中X是迭代次数

  • 显示“第一个孩子安静地死亡。”

第二个孩子应该做到以下几点:

  • 显示“第二个孩子出生后,我的pid是......”

  • 显示十倍的消息“老二执行迭代X“,其中X是迭代次数

  • 显示”第二个孩子安静地死亡。“

父进程应该做到以下几点:

  • 显示 “父进程是天生的,我的pid是......”

  • 创建的第一个孩子

  • 创建第二个孩子

  • display“Parent过程悄然死亡。“

使用gcc编译程序并将其命名为可执行的‘特效’执行程序数次,并注意如何将两个孩子的输出隔行

这项计划的一个可能的输出是:。

 
nova> ./procs 

Parent process is born, my pid is 7847 
First child is born, my pid is 7848 
First child executes iteration: 1 
First child executes iteration: 2 
First child executes iteration: 3 
First child executes iteration: 4 
First child executes iteration: 5 
Second child is born, my pid is 7849 
Second child executes iteration 1 
Second child executes iteration 2 
Second child executes iteration 3 
First child executes iteration: 6 
Second child executes iteration 4 
Second child executes iteration 5 
Second child executes iteration 6 
First child executes iteration: 7 
Second child executes iteration 7 
Second child executes iteration 8 
Second child executes iteration 9 
Second child executes iteration 10 
Second child dies quietly. 
First child executes iteration: 8 
First child executes iteration: 9 
First child executes iteration: 10 
First child dies quietly. 
Parent process dies quietly. 

回答

3
  1. 合适的父进程应该等待(使用wait() or waitpid()或特定于平台的变体)其孩子离开之前死亡。

  2. 并发执行需要调度程序有机会运行。您可以通过适当的睡眠(微睡眠,nano-sleep)操作来强制解决问题。一些系统调用会有帮助(所以fflush(0)可能会有所帮助)。


#include <stdio.h> 
#include <sys/wait.h> 
#include <time.h> 
#include <unistd.h> 

int main(void) 
{ 
    int pid, i; 
    struct timespec tw = { .tv_sec = 0, .tv_nsec = 10000000 }; 
    pid = fork(); 
    switch(pid) 
    { 
     case -1: 
      printf("Fork error"); 
      break; 
     case 0: 
      printf("First child is born, my pid is %d\n", getpid()); 
      for(i=1; i<10; i++) 
      { 
       printf("First child executes iteration %d\n", i); 
       nanosleep(&tw, 0); 
      } 
      printf("First child dies quietly.\n"); 
      break; 
     default: 
      printf("Parent process is born, my pid is %d\n", getpid()); 
      pid = fork(); 
      switch(pid) 
      { 
       case -1: 
        printf("Fork error"); 
        break; 
       case 0: 
        printf("Second child is born, my pid is %d\n", getpid()); 
        for(i=1; i<10; i++) 
        { 
         printf("Second child executes iteration %d\n", i); 
         nanosleep(&tw, 0); 
        } 
        printf("Second child dies quietly.\n"); 
        break; 
       default: 
        printf("Parent process waiting for children.\n"); 
        int corpse; 
        int status; 
        while ((corpse = waitpid(0, &status, 0)) > 0) 
         printf("Child %d died with exit status 0x%.4X\n", corpse, status); 
        printf("Parent process dies quietly.\n"); 
        break; 
      } 
    } 
    return 0; 
} 

输出示例:

Parent process is born, my pid is 46624 
First child is born, my pid is 46625 
First child executes iteration 1 
Parent process waiting for children. 
Second child is born, my pid is 46626 
Second child executes iteration 1 
First child executes iteration 2 
Second child executes iteration 2 
First child executes iteration 3 
Second child executes iteration 3 
First child executes iteration 4 
Second child executes iteration 4 
Second child executes iteration 5 
First child executes iteration 5 
Second child executes iteration 6 
First child executes iteration 6 
Second child executes iteration 7 
First child executes iteration 7 
Second child executes iteration 8 
First child executes iteration 8 
Second child executes iteration 9 
First child executes iteration 9 
First child dies quietly. 
Second child dies quietly. 
Child 46625 died with exit status 0x0000 
Child 46626 died with exit status 0x0000 
Parent process dies quietly. 

注意,10点毫秒的延迟几乎迫使交替执行。如果没有类似的东西,你会被系统和调度程序的特质所困扰,许多现代化的机器太快了!

+0

我的书有一个和我一样的例子,除了default还有一个for循环。结果通常看起来像parent1,parent2,child1,child2,child3,child4,parent3等。在我的第一个孩子的执行过程中,为什么不是第二个孩子开始执行? –

+1

你的机器速度太快了。 –

+0

谢谢。你的帮助激励我将睡眠(1)放入我的孩子的过程中,以证明他们同时在跑步。 –

1

fork()创建一个新的子进程,从父,其运行的独立。

如果你想父进程等待孩子们完成后,您可以使用系统调用wait,传递一个PID,这将阻塞,直到过程结束。

看文章wait(System Call) on Wikipedia

相关问题