在 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() as。
cout<<buff;
fflush(stdout);
cin>>buff;
fflush(stdin);
我写了一个程序来完成这个:
进程 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() as。
cout<<buff;
fflush(stdout);
cin>>buff;
fflush(stdin);