如何运行进程?
我创建的进程。其中之一prints "1" 30 times
。另一个prints "2" 30 times
。我希望这些进程依次打印他们的号码。如何运行进程?
像这样:
1
2
1
2
...
但每次我运行程序时,显示的数字是不同的:
1,2,2,1; 1,2,1,2,2,1,1,2.
谁能告诉我,请,如何解决这个问题呢?
这是一个预期的行为。过程分叉后(这是一个非常短的时间),两个进程将打印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://*.com/a/13274800/2183287
@Dean编辑了答案,问题是睡眠()分辨率为1s,这对于区分两个进程有相当大的影响,并且几乎具有相同的开始时间。 –
您的解决方案不健全。它可能适用于某些情况,但绝对不适用于许多情况。请阅读**竞赛条件**。 – Haris
@哈里斯,我不是提供解决方案,但解释问题的根源 –
进程完全独立运行。它们可以同时运行,它们可以一个接一个地运行,它们可以在非确定性时间之间在它们之间切换,或者这些“模式”的任意混合物一次运行一个。根本不知道什么时候运行哪个进程。
因此,使过程安全合作的唯一方法是让它们进行通信。在这里,你有一个选项很多:
管道让你两个叉进程之间发送的单向消息。该通信在默认情况下被阻止。
锁允许一个进程独占访问任何你喜欢的资源。
共享内存区域允许进程互相发送数据,而无需等待其他进程。
可以使用文件而不是锁或共享内存区域。它们重量更重,但不要求这些过程具有相当的体面。
无论您使用哪种通信方式,都必须使用其中一种来正确协调行为。
看到这些评论后,我觉得我需要找出自己的答案。
由于两个或n个进程彼此独立,他们不知道其他进程的存在,因此我们需要某种方式使它们在不破坏系统的情况下进行通信。
这就是所谓的IPC或进程间通信,一种方法是完成shared memory
。这是一个可以在两个或多个进程之间共享的内存区域。
但是,我们如何访问shared memory
,使用指针,我们可以做这样的事情:
的父进程将分配共享内存的块与mmap
。现在这个区域可以通过进程访问指针,在它们之间进行通信并共享数据。
一旦进程分叉,它们可以由一个共享变量来控制。值为'0'意味着过程'A'将被打印,'1'的值将意味着过程'B'将被打印。他们可以在打印一次后切换值。 – Haris
不是关于pid,它是内核用来简化其工作的标识符。我认为他正在讨论一个变量,它意味着要控制第二个进程何时完成其工作,这意味着要与mmap一起工作,这是进程之间的共享内存。 – user5159806
并非所有的程序都以相同的速度运行。 'fork()'之后你无法控制程序的速度。在单处理器系统上,两者都不能同时获得CPU,但这并不意味着它们可以在同一时间执行。 –