2015-01-04 40 views
1

我寫了一個程序來實現:在linux中使用兩個進程讀取文件?

過程P1將打開一個文件,然後P1將讀取高達若干行過程P2之後會有閱讀有相同的文件P1將閱讀後的文件,並以此類推,直到文件結尾。 例如文件包含100行,那麼p1將讀取0-10行,然後p2將讀取10-20,然後p1將讀取20-30行,依此類推。的P1

pid_t cpid; 
#define MAXR 5 //Maximum number of rows 
void sigread(int signo){ //When a signal received read MAXR line 
    int i; 
    char buf[MAXS]; 
    cout<<"p1\n"; 
    for(i=0;i<MAXR;i++){ 
      cin.getline(buf,MAXS); 
      cout<<buf<<"\n"; 
    } 
    signal(signo,sigread); //register signal again 
    kill(cpid,SIGUSR2);//send a signal to p2 to read another MAXR line 
} 
int main(){ 
    signal(SIGUSR1,sigread); //register signal handler to this process 
    char buf[MAXS]; 
    int c=-1; 
    fd = open("in.txt",O_RDONLY); 
    dup2(fd,0); //duplicate file descriptor to STD_IN 


    cpid = fork();//Create a child process 
    if(cpid<0){ 
     cout<<"Fork failed\n"; 
     exit(1); 
    } 
    if(cpid>0){ 
     while(1); //run forever 
    } 
    else{ 
     execlp("./p2","p2",NULL); //Use execlp to execute p2 
    } 
    return 0; 
} 

//當上述程序被執行然後process p2 doesn't read file at all即文件完全由P1和P2的打印一些垃圾值讀碼的P2

void sigread(int signo){ 
    int i=0; 
    char buff[MAXS]; 
    cout<<"p2\n"; 
    for(i=0;i<MAXR;i++){ 
     cin.getline(buff,MAXS); 
     cout<<buff<<"\n"; 
    } 
    signal(signo,sigread); 
    kill(getppid(),SIGUSR1); //send a signal to p1 
} 
int main(){ 
    signal(SIGUSR2,sigread); 
    kill(getppid(),SIGUSR1); //send signal to process p1 to read first MAXR lines 
    while(1); //run forever 
    return 0; 
} 

代碼。

在上面的代碼中應該做些什麼修改才能工作?或者有什麼錯誤?

+0

您需要將行號轉換爲文件偏移量(以字節爲單位)。這需要閱讀所有以前的文章。然後你需要一些IPC讓第一個過程與第二個過程進行通信。 – 2015-01-04 14:35:46

+0

要實現此[dup2()](http://linux.die.net/man/2/dup2)系統調用,請使用.. – 2015-01-04 14:41:30

回答

0

最後它的工作 只是我需要添加fflush()之後每進出。

cout<<buff; 
fflush(stdout); 
cin>>buff; 
fflush(stdin);