2015-05-30 45 views
-1

我有一個C示例程序,我需要轉換爲C#,但我不知道如何。轉換C(叉系統)爲C#

這裏的示例代碼:

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    printf("--beginning of program\n"); 

    int counter = 0; 
    pid_t pid = fork(); 

    if (pid == 0) 
    { 
     // child process 
     int i = 0; 
     for (; i < 5; ++i) 
     { 
      printf("child process: counter=%d\n", ++counter); 
     } 
    } 
    else if (pid > 0) 
    { 
     // parent process 
     int j = 0; 
     for (; j < 5; ++j) 
     { 
      printf("parent process: counter=%d\n", ++counter); 
     } 
    } 
    else 
    { 
     // fork failed 
     printf("fork() failed!\n"); 
     return 1; 
    } 

    printf("--end of program--\n"); 

    return 0; 
} 
+1

你到目前爲止嘗試過什麼? –

+0

我已經嘗試過使用過程開始因爲它說它是相同的叉系統,即時新行業,所以我試圖問它 – lamayooooooow

回答

4

在Windows相當於fork使用線程,因此你的代碼是平凡用C#編寫如下:

new Thread(new ThreadStart(()=> 
{ 
    for(int i=0;i<5;++i) 
    Console.WriteLine("child process, counter="+i); 
})).Start(); 

for(int i=0;i<5;++i) 
    Console.WriteLine("parent process, counter="+i); 
+0

線程確實是最現實的方式來實現Windows上的「叉狀」功能。更精確的實現需要認真的努力與CreateProcess(和可能更低級別的方法) - 一些鏈接可以找到http://stackoverflow.com/questions/985281/what-is-the-closest-thing-windows-has-to- fork/985525#985525 –

+1

@Alexei,這是我見過的最倒退的事情,當你有適當的線程支持時,在Windows上模擬'fork' ...我得到他們爲什麼需要它在Cygwin中,但追逐當你*可以*編寫線程代碼是非常奇怪的。 – Blindy

1

了POSIX fork方法創建一個副本作爲一個新進程,並將新進程標識(返回到稱爲fork的原始進程)或0返回到新創建的進程。兩種情況下,執行都在同一地點繼續進行。在C#或任何其他不使用posix兼容庫的語言中,沒有直接的等價物。

在C#中,我們使用了Blindy已經指出的線程。線程和fork之間的顯着差異在於,對於具有單個內存空間的單個進程的線程。這意味着當你改變一個共享變量時,它會改變所有的線程。對於每個進程都有自己的內存空間,並且您在該內存空間中所做的任何更改都不會自動反映到其他進程中。

還有其他的區別,但這可能是我能看到的最大的一個。創建多個進程有一些開銷和侷限性,不一定與多個線程一起出現,其中最重要的是,如果您只是開始一個新進程來執行一個小操作,它將會讓程序的整個內容進入該過程。線程可以簡單或複雜,而不會對其進程的內存空間產生太大影響。