Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何运行进程?_C - Fatal编程技术网

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,你在逗号后使用了省略号,这是什么意思?单词很重要,但这不是政治迫害。