[英]Is shared virtual memory used when multiple processes read a file using file pointer in Linux?
[英]Read a file using two processes in 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;
}
// 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;
}
執行上述程序后, process p2 doesn't read file at all
即p1完全讀取了文件,而p2打印了一些垃圾值。
要在上面的代碼中進行哪些修改才能起作用? 或有什么錯誤?
終於可以正常工作了,只是我需要在每次進出后都添加fflush()。
cout<<buff;
fflush(stdout);
cin>>buff;
fflush(stdin);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.