管道数据交换时的IPC并发性

时间:2017-04-29 15:35:57

标签: c pipe ipc semaphore

我正在尝试使用以下代码来在具有多个管道的进程之间进行多次数据交换。我使用信号量来避免并发错误。

永不消亡的子进程处理storeSomeData(),其他进程与此进程通信以存储和检索数据。

代码的抽象模型如下:

#define _Size_OF_IPCB                
struct sembuf up = {0, 1, 0};
struct sembuf down = {0, -1, 0};
int mySemaphore;                      //Initialization of the semaphore

int keyFD[2];
int valFD[2];
int retFD[2]; //pipe file descriptors

int main(){
    pipe(keyFD);
    pipe(valFD); //assignments of FDs
    pipe(retFD);
    mySemaphore=semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT); //semaphore init

    pid_t pid;
    pid = fork();
    if(pid==0) //process that never dies
    {
        while(1){
            read(keyFD[0], ipcBUFFER, _Size_OF_IPCB); //blocks at read
            if(ipcBuffer[0]=='f') //foo
            {
                write(retFD[1], someData(), strlen(someData())); //writes back
            }
            else if(ipcBuffer[0]=='b') //bar
            {
                read(valFD[0], ipcBUFFER2, _Size_OF_IPCB); //read again
                storeSomeData(); //store the data
            }
        }
    }
    else //father
    {
        semctl(mySemaphore, 0, SETVAL, 1); //unlocking semaphore
        while(1){ 
             someBlockingOnInputFunction(); //father is waiting a user input
             pit_t pidChild;
             pidChild=fork();
             if(pidChild==0) //child will handle this input
             {
                  bufferDataCreation(); //input handling
                  semop(mySemaphore, &down, 1); // locking semaphore
                  if(buffer[0]=='f') //foo
                  {
                      write(keyFD[1], buffer, strlen(buffer)); //writes
                      read(retFD[0], readBuffer, _Size_OF_IPCB); //reads
                  }
                  else if(buffer[0]=='b') //bar
                  {
                      write(keyFD[1], buffer, strlen(buffer)); //writes
                      write(valFD[1], buffer, strlen(buffer)); //writes
                  }
                  semop(mySemaphore, &up, 1); //unlocking semaphore
                  close(keyFD[0]);
                  close(keyFD[1]);
                  close(valFD[0]);
                  close(valFD[1]);
                  close(retFD[0]);
                  close(retFD[1]);
                  exit(1);
             }
         }
    }

因此父亲不断获得用户输入,将“工作”传递给另一个孩子,并且这个孩子与创建的第一个孩子进行通信,以交换或存储关于用户输入的一些数据。

当用户输入一个接一个地运行时,一切正常。如果用户输入以更快的速度一个接一个地开始(使用脚本来实现),上面的过程就会挂起。 “永不消逝的进程”等待读取或写入,或者反过来处理输入并尝试读取或写入管道的子进程。

我不是要求代码更正。上述模型的逻辑中的某些内容是错误的吗?我不熟悉管道,我不明白是什么问题。

感谢您提供任何帮助!

0 个答案:

没有答案