2013-05-05 23 views
3

至於線程,我有互斥和條件,所以我可以很容易地操縱它們。
但是,如果我通過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 

然後似乎進入一個無限循環。
有什麼問題?
什麼是交替過程的正確方法?

謝謝。

+0

我相信你是在做這個練習,並且*知道操作系統將在管道滿或空時根據需要處理阻塞進程,是的? – dmckee 2013-05-05 00:58:17

+0

不是。這確實是一個練習,但我的教授從來沒有講過關於操作系統處理不同管道情況的過程的方式。 – octref 2013-05-05 01:01:04

回答

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可能非常不同。

它看起來像你已經有一個管道,所以你可以使用它來讓每一方在完成打印後向對方發送消息。另一端會進行阻塞式讀取,然後在發送消息時返回,執行打印,發回消息並返回阻塞式讀取。

+0

感謝您的資源!我會嘗試先用管道做。 – octref 2013-05-05 01:04:38

1

他們是獨立的進程,所以每個都有自己的標誌;改變它不會影響W的。

+0

我不知道!這就是爲什麼。哦,這就是爲什麼我需要一個管道.. – octref 2013-05-05 00:58:40

+0

是的,這是線程和進程之間最大的區別之一 - 線程共享內存空間,進程有自己的(至少在邏輯上) – xaxxon 2013-05-05 01:09:41

1

爲了讓兩個進程在不共享相同地址空間的情況下相互通信(如線程),他們必須使用進程間通信方式(又名IPC)。一些IPC機制是:共享內存,信號量,管道,套接字,消息隊列等等。大多數情況下,IPC機制都是特定於操作系統的。然而,許多想法都是足夠普遍的,所以有可能提出一個便攜式實現,Boost項目作爲Boost.Interprocess庫的一部分。我認爲你應該首先看看Synchronization Mechanisms部分。但請注意,這是一個C++庫。我不知道任何C庫與Boost一樣好。

希望它有幫助。祝你好運!

+1

Boost只有C++,我相信。這可能與手頭的問題無關。 – xaxxon 2013-05-05 01:03:50

+0

這確實有幫助。謝謝! – octref 2013-05-05 01:06:02

+0

@xaxxon:好點,我以某種方式跳過語言標籤: - ] – 2013-05-05 01:06:35