如何运行流程?

时间:2015-10-18 08:35:21

标签: c

我创建了流程。其中一个prints "1" 30 times。另一个prints "2" 30 times。我希望这些流程依次打印他们的数字。

像这样:

1
2
1
2
...

但是每次运行程序时,数字都会以不同的方式显示:

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

有人可以告诉我,如何解决这个问题?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

进程完全独立运行。它们可以同时运行,它们可以一个接一个地运行,它们可以一次运行一个,在非确定性时间之间切换,或者这些&#34;模式的任何混合&#34;。根本无法确定哪个进程运行。

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

  • 管道允许您在两个分叉进程之间发送单向消息。默认情况下,此通信是阻止的。

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

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

  • 可以使用文件代替锁或共享内存区域。它们的重量要大得多,但并不要求这些过程很普通。

无论您使用何种通信,都必须使用一种方式来获得正确协调的行为。

答案 2 :(得分:1)

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

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

这称为IPC或进程间通信,实现此目的的一种方法是prefetch_related。这是一个可以在两个或多个进程之间共享的内存区域。

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

父进程将使用shared memory分配一块共享内存。现在,可以通过进程使用指针来访问此区域,以便在它们之间进行通信并共享数据。