这是我的代码中感兴趣的部分(半模化,因为它有点乱): Archive.c:

int main(int argc, char* argv[])
{
    pthread_t* thread_tid;
    pthread_create(&thread_tid, NULL, wthread_boss_body, NULL);
    xpthread_join(tid_sig_handler, NULL, QUI);  
    return 0;
}

void* wthread_boss_body(void* v)
{
    dati* tdati = (dati*)v;
    int fd = open("caposc",O_RDONLY);
    if(fd<0) error handling...

    while(true)
    {
        char test[7];
        puts("provo a leggere...\n");
        read(fd, test, 7);
        printf("ecco qua: %s", test);
        sleep(1);
    }
    pthread_exit(NULL);
}

Server.py:

FIFOcaposc = 'caposc'
def main():
    try:
        os.mkfifo(FIFOcaposc)
    except FileExistsError:
        pass
    except OSError as e:
        print(f"Creazione FIFO {FIFOcaposc} fallita: {e}")
        exit(1) 
    
    
    try:
        caposc = open(FIFOcaposc, 'w')
        print("caposc aperta\n")
    except OSError as e:
        print(f"Apertura FIFO {FIFOcaposc} fallita: {e}")
        exit(1)

    while(True):
        print("writing...\n")
        print(f"{caposc.write('abcdefg')}\n")
        time.sleep(1)
    

    caposc.close()
    capolet.close()
    os.unlink(FIFOcaposc)
    os.unlink(FIFOcapolet)

main()

同时运行这两个文件时,server.py会一直循环,并按预期在FIFO上写入(WRITE返回值始终为7),但achve.c在第一个周期的读操作中保持不变,再也不会返回.据我所知,在FIFO上有可供读取的内容之前,读取器不会返回.但既然看起来真的有什么可读的,我的脑子就被炸开了.

我又做了几个愚蠢的节目,我做了这个,这个效果很好: Test.c:

void* thread_body(void* v);

int main(int argc, char* argv[])
{
    pthread_t t1;
    
    pthread_create(&t1, NULL, &thread_body, NULL);
    
    pthread_join(t1, NULL);
}


void* thread_body(void* v)
{
    int fd = open("pipeprova", O_RDONLY);
    
    char stringa[8];
    while(true)
    {
        int e = read(fd, &stringa, 7);
        if(e == 0) puts("no");
    
        stringa[7] = '\0';
        printf("%s\n", stringa);
    }
    pthread_exit(NULL);
}

Testpy.py:

try:
    os.mkfifo("pipeprova")
except FileExistsError:
    pass
except OSError as e: # TODO: verifica che OSError non comprenda FileExistsError
    print(f"Creazione FIFO fallita: {e}")
    exit(1)
try:
    fifo = open("pipeprova", 'w')
    print("aperta\n")
except OSError as e:
    print(f"Apertura FIFO fallita: {e}")
    exit(1)
while(True):
    print(f"{fifo.write('abcdefg')}\n")
fifo.close();

我真的不明白哪里错了,经过长时间的研究,我发现了一些能让我的代码正常工作的东西,而在我的server.py中,它是有效的:

while(True):
    caposc = open(FIFOcaposc, 'w')
    print("writing...\n")
    print(f"{caposc.write('abcdefg')}\n")
    time.sleep(1)
    caposc.close()

我真的需要每次都打开和关闭系统调用吗?为什么?有没有更有效的方法?

推荐答案

默认情况下,对Python中的文件I/O进行缓冲.这意味着在刷新或关闭流或使内部缓冲区溢出之前,不会向FIFO中实际写入任何内容.

要解决此问题,请禁用缓冲(并使用二进制模式,并在写入时将字符串转换为字节):

caposc = open(FIFOcaposc, 'wb', buffering=0)
...
print(f"{caposc.write('abcdefg'.encode())}\n")

或者时不时地刷新缓冲区

print(f"{caposc.write('abcdefg')}\n")
caposc.flush()

C++相关问答推荐

ISO_C_BINDING,从Fortran调用C

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

常数函数指针优化

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

测量ARM MCU中断延迟的问题

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

向上强制转换C中的数值类型总是可逆的吗?

C++中矢量类型定义和数据保护的高效解决方案

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

在每种If-Else情况下执行语句的最佳方式

如何用c语言修改shadow文件hash部分(编程)?

For循环中的变量行为不符合预期.[C17]

用C++构建和使用DLL的困惑

C程序向服务器发送TCPRST

C-try 将整数和 struct 数组存储到二进制文件中

为什么我的二叉树删除删除整个左部分的树?

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

try 判断长整数是否为素数

指向返回 struct 成员的指针,安全吗?

如何在C中以0x格式打印十六进制值