C 如何运行进程?
我创建了流程。其中一个C 如何运行进程?,c,C,我创建了流程。其中一个打印“1”30次。另一个打印“2”30次。我希望这些进程依次打印数字 像这样: 1 2 1 2 ... 但每次我运行程序时,显示的数字都不同: 1,2,2,1; 1,2,1,2,2,1,1,2. 有人能告诉我如何解决这个问题吗?这是一种预期行为。进程分叉后(这是一个相当小的持续时间),两个进程将根据其id打印2或1。由于休眠方法分辨率为1秒,且两个分叉进程之间的时间差与此相比太小,因此打印id的顺序将不确定,因为两个进程调用printf函数的时间非常接近(可能在微秒分辨
打印“1”30次
。另一个打印“2”30次
。我希望这些进程依次打印数字
像这样:
1
2
1
2
...
但每次我运行程序时,显示的数字都不同:
1,2,2,1; 1,2,1,2,2,1,1,2.
有人能告诉我如何解决这个问题吗?这是一种预期行为。进程分叉后(这是一个相当小的持续时间),两个进程将根据其id打印2或1。由于休眠方法分辨率为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);
}
}
if(pid==0)
{
对于(i=1;i进程彼此完全独立地运行。它们可以同时运行,可以一个接一个地运行,可以一次运行一个,在不确定的时间切换,或者这些“模式”的任何混合。根本不知道哪个进程何时运行
因此,让流程安全协作的唯一方法是让它们进行通信。在这里,您有很多选择:
- 管道允许您在两个分叉进程之间发送单向消息。默认情况下,此通信处于阻塞状态
- 锁允许一个进程以独占方式访问您喜欢的任何资源
- 共享内存区域允许进程相互发送数据,而无需等待其他进程
- 文件可以用来代替锁或共享内存区域。它们的重量要重得多,但不需要普通的进程
无论你使用何种沟通方式,你都必须使用一种方式来获得正确的协调行为。看到这些评论后,我觉得我需要找到自己的答案
由于两个或n个进程相互独立,它们不知道其他进程的存在,因此我们需要某种方法使它们在不破坏系统的情况下进行通信
这称为IPC或进程间通信,实现这一点的一种方法是共享内存
。这是一个可以在两个或多个进程之间共享的内存区域
但是我们如何使用指针访问共享内存
,我们可以这样做:
父进程将使用mmap
分配一块共享内存。现在,进程可以通过指针访问该区域,在它们之间进行对话并共享数据。一旦进程分叉,它们就可以由共享变量控制。0
值意味着进程a
将打印,值1
表示进程B
将打印。他们可以在打印一次后切换值。不,这不是关于pid,它是内核用来简化其作业的标识符。我想他说的是一个变量,用于控制第二个进程何时执行其作业,这意味着使用mmap,即共享内存进程。并非所有程序都以相同的速度运行。在fork()
之后,您无法控制程序的速度。在单处理器系统上,两个程序都不能同时获得cpu,但这并不意味着它们的执行时间相同。@Dean编辑了答案,问题是sleep()1的分辨率非常大,可以区分两个进程,它们的起始时间几乎相同。您的解决方案不可靠。它可能适用于某些情况,但肯定不适用于许多情况。请阅读有关种族条件的内容。@Haris,我不是提供解决方案,而是解释问题的根源wers说要解决这个问题,……这意味着这是一个解决方案。@Haris,你在逗号后使用了省略号,这是什么意思?单词很重要,但这不是政治迫害。