我正在尝试使用以下代码来在具有多个管道的进程之间进行多次数据交换。我使用信号量来避免并发错误。
永不消亡的子进程处理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);
}
}
}
因此父亲不断获得用户输入,将“工作”传递给另一个孩子,并且这个孩子与创建的第一个孩子进行通信,以交换或存储关于用户输入的一些数据。
当用户输入一个接一个地运行时,一切正常。如果用户输入以更快的速度一个接一个地开始(使用脚本来实现),上面的过程就会挂起。 “永不消逝的进程”等待读取或写入,或者反过来处理输入并尝试读取或写入管道的子进程。
我不是要求代码更正。上述模型的逻辑中的某些内容是错误的吗?我不熟悉管道,我不明白是什么问题。
感谢您提供任何帮助!