如何使流程交替进行?

时间:2013-05-05 00:53:28

标签: c process fork

至于线程,我有互斥和条件,所以我可以很容易地操纵它们 但是,如果我按fork()创建两个流程,我怎么能让它们交替? 或者,有没有办法为流程创建“关键部分”?

我打算制作一个打印“r”和“w”的程序,这里是代码。

#include <stdio.h>
#include <stdlib.h>

int pipe_1[2];
int flag = 0;

void r();
void w();

int main() {
    pipe(pipe_1);

    if(fork()) 
        r();
    else
        w();
}

void r() {
    int count = 0;
    while(1) {
        printf("%d \n", flag);
        if (count == 10)
            exit(0);
        if(flag == 0) {
            puts("r");
            flag = 1;
            count++;
            while(flag == 1)
                ;
        }
    }
}

void w() {
    while(1) {
        if(flag == 1) {
            puts("w");
            flag = 0;
            while(flag == 0)
                ;
        }
    }
}

输出只是:

0
r  

然后它似乎进入一个无限循环 有什么问题?
什么是交替流程的正确方法?

感谢。

3 个答案:

答案 0 :(得分:1)

它们是独立的进程,因此每个进程都有自己的标志;改变它不会影响w。

答案 1 :(得分:1)

这可能是压倒性的,但你可以使用大量的原语。在此处查看列表。

http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html

看一下清单,几乎所有这些都可以使用。有些更像传统的pthread同步原语,有些更高级,但仍可用于同步。

例如,你可以在两者之间打开一个TCP套接字,并在另一边转发时发送消息。也许有一个递增的数字。

或许更传统的东西就是信号量:

http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html#semaphores

此外,这假设是一个类似现代unix的平台。 Windows可能非常不同。

看起来你已经有了一个管道,所以你可以使用它来让每一方在完成打印后向另一方发送消息。另一方会进行阻塞读取,然后在发送消息时返回,执行打印,发回消息,然后返回阻止读取。

答案 2 :(得分:1)

为了使两个进程相互通信而不共享相同的地址空间(如线程一样),它们必须使用进程间通信手段(又称IPC)。一些IPC机制是:共享内存,信号量,管道,套接字,消息队列等。大多数情况下,IPC机制是特定于操作系统的。但是,很多想法都足够通用,因此可以提出一个可移植的实现,Boost项目将其作为Boost.Interprocess库的一部分。我认为你首先应该看看Synchronization Mechanisms部分。但请注意,这是一个C ++库。我不知道任何C库和Boost一样好。

希望它有所帮助。祝你好运!