2012-07-04 69 views
-1

我試圖實現匿名管道而不使用系統調用: pipe(),fork(),mkfifo(),open(),read(),write(),close()。實現匿名管道

基本上我實現的匿名管道與共享存儲器,其中兩個文件描述符(兩者都具有共享存儲器ID) 一個用於讀取器和其它用於寫入器,通過兩個信號量 其中我不唯一的情況進行通信不是指在叉子的情況下。

我的問題是我應該如何實施撥號電話,或者我應該如何處理這種情況。

我被允許使用pthread_atfork()和atexit()系統調用。

非常感謝。

P.S

我正在爲了強調究竟應該如何 我實施工作連接管道常規短代碼。

該代碼的作品!它只是爲了說明我的功能應該如何工作的 方式。

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

    int main() 
    { 
     int pfd[2], rb; 
     char buff[100]; 
//I implemented this syscall by allocating shared memory 
     if (pipe(pfd)<0) 
     { 
     return -1; 
     } 
    //here is my problem. I don’t know how to treat this syscall  
    if (fork()) 
     { 

     sleep(5); 
    //I implemented this syscall by two file descriptors which communicate via two 
    //semaphores 
     write(pfd[1], "hello world\n", sizeof("hello world\n")); 
     wait(NULL); 
     } 
     else 
     { 
    //I implemented this syscall by two file descriptors which communicate via two 
    //semaphores 

     rb = read(pfd[0], buff, sizeof(buff)); 
     if (rb < 0) 
      perror("SON: read"); 
     else 
     { 
      printf("SON: writing %d\n", rb); 
      write(1, buff, rb); 
     } 
     } 

     return 0; 
    } 

此致

埃利

+0

謝謝,但正如我寫在我的問題。代碼正常工作,並且沒有必要更改它 –

+0

爲了使匿名管道工作,我們使用fork。 我試圖實現共享內存和信號量的管道。 我的問題是我應該如何實施撥號電話,或者我應該如何處理這種情況。 順便說一句,這不是我的代碼。該代碼取自背誦網站 ,因此應該可以正常工作(忽略第一個關閉pfd [1]的事實) http://motigeva.com/os/files/pipe1.c –

+1

所以你想模擬管道(2)使用其他OS-primitives/syscalls。家庭作業? – wildplasser

回答

0

fork不是實現匿名管道必要的,儘管它可能需要測試它。如果您使用的是傳統Unix的平臺,那麼創建新進程的大多數方法都會涉及到系統調用fork。你的選擇是:

  • vfork緊接着exec,假設你可以找到你的程序,並提供適當的ARGS;
  • 從外部調用程序的另一個副本;或
  • 線程(pthread_create)。
+0

在我測試的情況下,叉已創建。我該怎麼辦? –

+0

@EliKatzav我不清楚你明白'叉'的作用。它使用相同的映像和內存創建另一個進程實例,只有pid和'fork'調用的返回值不同。 – ecatmur