2016-02-20 79 views
1

我試圖解決有關進程間通信和管道的操作系統書中的一個例子,但我遇到了一些困難。它讓我在父母和孩子中找到時間,然後用兒童no1打印出來。一些睡覺的孩子沒有2應該打印在兒童no1中找到的時間信息。並且在一些睡覺的父母應該打印在兒童no2中發現的時間信息之後。所以我認爲我應該創建3管道,因爲我需要傳遞時間信息3次。我試圖設計他們之間的孩子一和孩子二,但我不知道如果我做得正確。另一個問題是,我不知道如何打印當我嘗試使用printf%d打印它時,它會給我0任何人都可以幫助我將時間從父母傳遞給孩子number1並打印出來,以便我可以測試我的程序?下面是我的代碼。C/UNIX中兩個孩子和父母之間的連續管道

#include<stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/time.h> 
#include<signal.h> 



int main(int argc, char** argv) 
{ 
    struct timeval t1; 
    struct timeval t2; 
    struct timeval t3; 
    int firstchild,secondchild; 
    firstchild=fork(); 
     int mypipe[2]; 
    int mypipe2[2]; 
    int mypipe3[2]; 

     if(pipe(mypipe) == -1) { 
      perror("Pipe failed"); 
      exit(1); 
     } 

     if(firstchild == 0)   //first child 
     { 

     close(STDOUT_FILENO); //closing stdout 
      dup(mypipe[1]);   //pipewrite is replaced. 
     sleep(3);    
      close(mypipe[0]);  //pipe read is closed. 
      close(mypipe[1]);  //pipe write is closed 

     }else{ 
    secondchild=fork();  //Creating second child 

     if(secondchild == 0)   //2nd child 
     { 
      close(STDIN_FILENO); //closing stdin 
      dup(mypipe[0]);   //pipe read 
     sleep(6); 
      close(mypipe[1]);  //pipe write is closed. 
      close(mypipe[0]);  //pipe read is closed. 

     }else{   //Parent 

    gettimeofday(&t1,NULL); 
    printf("\n Time is %d ",gettimeofday(&t1,NULL)); 
    sleep(9); 
    printf("\n Parent:sent a kill signal to child one with id %d ",secondchild-1); 
    printf("\n Parent:sent a kill signal to child two with id %d ",secondchild); 
    kill(secondchild-1,SIGKILL);  
    kill(secondchild,SIGKILL); 
    exit(1);}} 
     close(mypipe[0]); 
     close(mypipe[1]); 
     return 0; 
    } 

讓問題更清楚一點:我認爲dup工作正常。我需要的是父母和第一個孩子之間的工作管道,以及用第一個孩子打印時間(父母計算)的方法,以便我可以測試他們兩個人的工作並繼續編寫代碼。我打開使用不同風格的管道,只要它工作。使用dup是我在書中看到的東西,因此我使用的東西

+1

你閱讀的手冊頁*您正在使用的任何*功能?你希望從'dup(mypipe [0])獲得什麼;'?你是否認爲回報價值*可能具有某種意義? – EOF

+0

只是一個評論:在標準的英文寫作中,在標點符號後面加上一個空格。 ,? ! ; :'。你的文章沒有這樣做,這使得它很難閱讀。 –

+0

@EOF我同意這個問題有點不清楚。但我認爲'dup'可以,因爲它正在用'mypipe [0]'替換stdin。這是因爲'STDIN_FILENO'在'dup'之前關閉了。它依賴於dup使用最小編號的未使用描述符作爲新描述符的事實(引用來自手冊頁)。我也不知道這種技術,並最近在SO上了解到這一點。 – kaylum

回答

0

我應該創建3個管道,因爲我需要傳遞時間信息3 times.I試圖設計其中之一兒童之間和兒童之間 但我不知道如果我做得對。

firstchild=fork(); 
     int mypipe[2]; 
    … 
     if(pipe(mypipe) == -1) … 

你沒有相當。您必須在fork()之前創建管道,否則兒童無法訪問父級管道(的讀取端)。

路過的時候從父到子NUMBER1

家長:

gettimeofday(&t1, NULL); 
    write(mypipe[1], &t1, sizeof t1); 

第一個孩子:

 read(mypipe[0], &t1, sizeof t1); 

我不知道如何打印時間。當我嘗試使用printf進行打印時%d它給了我0.1

printf("\n Time is %d ",gettimeofday(&t1,NULL)); 

你沒有打印的時間,但什麼gettimeofday()函數返回,這是正確的0:

 printf(" Time is %ld\n", (long)t1.tv_sec); 
相關問題