我試圖解決有關進程間通信和管道的操作系統書中的一個例子,但我遇到了一些困難。它讓我在父母和孩子中找到時間,然後用兒童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是我在書中看到的東西,因此我使用的東西
你閱讀的手冊頁*您正在使用的任何*功能?你希望從'dup(mypipe [0])獲得什麼;'?你是否認爲回報價值*可能具有某種意義? – EOF
只是一個評論:在標準的英文寫作中,在標點符號後面加上一個空格。 ,? ! ; :'。你的文章沒有這樣做,這使得它很難閱讀。 –
@EOF我同意這個問題有點不清楚。但我認爲'dup'可以,因爲它正在用'mypipe [0]'替換stdin。這是因爲'STDIN_FILENO'在'dup'之前關閉了。它依賴於dup使用最小編號的未使用描述符作爲新描述符的事實(引用來自手冊頁)。我也不知道這種技術,並最近在SO上了解到這一點。 – kaylum