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;
}
代碼。
在上面的代碼中應該做些什麼修改才能工作?或者有什麼錯誤?
您需要將行號轉換爲文件偏移量(以字節爲單位)。這需要閱讀所有以前的文章。然後你需要一些IPC讓第一個過程與第二個過程進行通信。 – 2015-01-04 14:35:46
要實現此[dup2()](http://linux.die.net/man/2/dup2)系統調用,請使用.. – 2015-01-04 14:41:30