Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在linux中使用两个进程读取文件?_C++_Linux_File_File Io_Signals - Fatal编程技术网

C++ 在linux中使用两个进程读取文件?

C++ 在linux中使用两个进程读取文件?,c++,linux,file,file-io,signals,C++,Linux,File,File Io,Signals,我编写了一个程序来实现这一点: 进程p1将打开一个文件,然后p1将读取该文件,直到文件结束。进程p2将读取同一文件,然后p1将读取,以此类推,直到文件结束。 e、 g.文件包含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 rea

我编写了一个程序来实现这一点:

进程p1将打开一个文件,然后p1将读取该文件,直到文件结束。进程p2将读取同一文件,然后p1将读取,以此类推,直到文件结束。 e、 g.文件包含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;
}
pid\t cpid;
#定义MAXR 5//最大行数
无效sigread(int signo){//当接收到读取MAXR行的信号时
int i;
字符buf[MAXS];
最后它能起作用吗
只是我需要在每次输入和输出之后添加fflush()

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

您需要将行号转换为文件偏移量(以字节为单位)。这需要读取前面的所有行。然后您需要一些IPC让第一个进程与第二个进程通信该偏移量。为了实现此目的,使用了系统调用。。
cout<<buff;
fflush(stdout);
cin>>buff;
fflush(stdin);