2015-10-18 57 views
2

我创建的进程。其中之一prints "1" 30 times。另一个prints "2" 30 times。我希望这些进程依次打印他们的号码。如何运行进程?

像这样:

1 
2 
1 
2 
... 

但每次我运行程序时,显示的数字是不同的:

1,2,2,1; 1,2,1,2,2,1,1,2. 

谁能告诉我,请,如何解决这个问题呢?

+1

一旦进程分叉,它们可以由一个共享变量来控制。值为'0'意味着过程'A'将被打印,'1'的值将意味着过程'B'将被打印。他们可以在打印一次后切换值。 – Haris

+0

不是关于pid,它是内核用来简化其工作的标识符。我认为他正在讨论一个变量,它意味着要控制第二个进程何时完成其工作,这意味着要与mmap一起工作,这是进程之间的共享内存。 – user5159806

+0

并非所有的程序都以相同的速度运行。 'fork()'之后你无法控制程序的速度。在单处理器系统上,两者都不能同时获得CPU,但这并不意味着它们可以在同一时间执行。 –

回答

3

这是一个预期的行为。过程分叉后(这是一个非常短的时间),两个进程将打印2或1,具体取决于它们的ID。由于睡眠方法的解析度为1秒,两个分叉进程之间的时间差与此相比太小,所以打印ID的顺序不会是确定的,因为这两个进程将调用printf函数的时间相当接近(在微秒分辨率上可能)。为了能够订购打印数字,你可以延迟添加到过程中的一种:

if(pid==0) 
    { 
     for(i=1;i<=30;i++) 
     { 
      printf("%s\n","2"); 
      sleep(2); 
     } 
    } 
    else 
    { 
     sleep(1); 
     for(i=1;i<30;i++) 
     { 
      printf("%s\n","1"); 
      sleep(2); 
     } 
    } 

因此,预计不会分叉过程,以一个完美的同步运行。为了实现进程间同步,您可以使用进程间共享变量:https://stackoverflow.com/a/13274800/2183287

+0

@Dean编辑了答案,问题是睡眠()分辨率为1s,这对于区分两个进程有相当大的影响,并且几乎具有相同的开始时间。 –

+4

您的解决方案不健全。它可能适用于某些情况,但绝对不适用于许多情况。请阅读**竞赛条件**。 – Haris

+1

@哈里斯,我不是提供解决方案,但解释问题的根源 –

2

进程完全独立运行。它们可以同时运行,它们可以一个接一个地运行,它们可以在非确定性时间之间在它们之间切换,或者这些“模式”的任意混合物一次运行一个。根本不知道什么时候运行哪个进程。

因此,使过程安全合作的唯一方法是让它们进行通信。在这里,你有一个选项很多

  • 管道让你两个叉进程之间发送的单向消息。该通信在默认情况下被阻止。

  • 锁允许一个进程独占访问任何你喜欢的资源。

  • 共享内存区域允许进程互相发送数据,而无需等待其他进程。

  • 可以使用文件而不是锁或共享内存区域。它们重量更重,但不要求这些过程具有相当的体面。

无论您使用哪种通信方式,都必须使用其中一种来正确协调行为。

1

看到这些评论后,我觉得我需要找出自己的答案。

由于两个或n个进程彼此独立,他们不知道其他进程的存在,因此我们需要某种方式使它们在不破坏系统的情况下进行通信。

这就是所谓的IPC或进程间通信,一种方法是完成shared memory。这是一个可以在两个或多个进程之间共享的内存区域。

但是,我们如何访问shared memory,使用指针,我们可以做这样的事情:

的父进程将分配共享内存的块与mmap。现在这个区域可以通过进程访问指针,在它们之间进行通信并共享数据。