来自Python的C信号量

来自Python的C信号量,python,c,ipc,semaphore,Python,C,Ipc,Semaphore,我有一个C代码,其中我使用信号量实现了一个锁定机制。基本流程如下所示- int s=1; void wait(){ while(s<=0); s--; } void pipeData(paTestData *data){ wait(); SAMPLE *tempBuff = (SAMPLE*)malloc(sizeof(SAMPLE)*FRAME_SIZE); int readCount = FRAME_SIZE; while(

我有一个C代码,其中我使用信号量实现了一个锁定机制。基本流程如下所示-

int s=1;
void wait(){

    while(s<=0);
    s--;
}

void pipeData(paTestData *data){

    wait();

    SAMPLE *tempBuff = (SAMPLE*)malloc(sizeof(SAMPLE)*FRAME_SIZE);
    int readCount   = FRAME_SIZE;

    while(readCount > 0){

        tempBuff[FRAME_SIZE - readCount] = data->sampleValues[data->readFromCB];        
        data->readFromCB++;
        readCount--;
    }

    fd = open(fifoPipe, O_WRONLY);

    write(fd, tempBuff, sizeof(tempBuff));
    close(fd);

    free(tempBuff);

}

int callBack(){

    // Perform data acquisition and call foo

   foo();

    // Rest code here
}
ints=1;
无效等待(){
而(s 0){
tempBuff[FRAME_SIZE-readCount]=data->sampleValues[data->readFromCB];
数据->从CB++读取;
读取计数--;
}
fd=打开(仅限FIFOPPE、O_WR);
写入(fd、tempBuff、sizeof(tempBuff));
关闭(fd);
免费(tempBuff);
}
int回调(){
//执行数据采集并调用foo
foo();
//这里是Rest代码
}
读取器端的python代码如下所示:

with open(FIFO, 'rb') as fifo:
                print("Pipe opened")
                count=0
                while count<framelen:
                    Rsample = fifo.read()
                    frame = np.fromstring(Rsample,dtype=np.float32)

                    if (len(frame)>0):
                        print(frame)
                        count=count + len(frame)
打开(FIFO,'rb')作为FIFO:
打印(“管道打开”)
计数=0
而(0):
打印(帧)
计数=计数+长度(帧)
管道另一端的数据由Python脚本处理。问题在于,在python端读取管道无法获取完整的数据集

这是因为我已经读到,对于
命名管道
,对于每次写入,都应该有一个读卡器,否则在下一次迭代中,打开的管道会被阻塞

在这种情况下,在将
10个样本
写入管道之后,python的读卡器实现能够
只读取前两个样本
,管道可以随时用于下一个写入集

这就是为什么我一直在寻找一个同样的
锁定机制的原因

我的怀疑是-

1) 有没有一种方法可以增加s变量(有点 C中的signal()函数每次调用python脚本 完成对管道中所有数据的轮询

2) 有没有其他顺利实施的问题,有没有 C和Python之间的其他IPC技术是否启用了锁定机制

谢谢

write(fd, tempBuff, sizeof(tempBuff));
上述行仅将4/8字节(32位/64位)的数据从tempBuff写入管道

如果要在tempBuff中写入所有数据,需要将行更改为

write(fd, tempBuff, sizeof(SAMPLE)*FRAME_SIZE);

我认为你需要更好地解释你的实际问题。你在等什么情况?写入管道没有问题,只要管道缓冲区已满,它就会立即阻塞。除此之外,您的信号量实现不是原子的,因此它在并发性方面或多或少是无用的。同步进程的一个简单解决方案是使用更多管道,其中一个信号向该管道写入一个字符(而另一端是阻塞读取),我看不到任何管道代码。你说你在“轮询”,那么你是在使用非阻塞管道吗?您看过新的ish异步IO模块了吗@FelixPalmen我认为使用另一个
管道可以解决这个问题。将在实施后通知您。谢谢信号量和许多其他线程间信号都不能在操作系统内核之外合理地实现,因为线程不能在用户空间中被阻塞。谢谢,但是有什么方法可以让我使用python中的
signal()
函数类型来增加C中的
s
变量?我是说这可能吗?这实际上解决了我的问题,但通过这个实现,我想学习如何从Python脚本处理C信号量。谢谢@AshishK您的C代码中的内容不是一个可用的信号量,所以最好现在就忘掉它。@FelixPalmen ok。非常感谢您抽出时间,我很感激:)