Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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进程发送到Python进程_Python_C_Pipe - Fatal编程技术网

使用管道将数据从C进程发送到Python进程

使用管道将数据从C进程发送到Python进程,python,c,pipe,Python,C,Pipe,我试图将数据从C程序发送到python程序(两者同时运行)。我试图在C中使用popen函数。按照我的理解,无论我在C中写入文件描述符什么,都可以从python程序的stdin中读取。但是,python程序似乎挂起在从stdin读取的位置。有什么建议吗 下面是C程序: test.c #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(void) { FILE * fp

我试图将数据从C程序发送到python程序(两者同时运行)。我试图在C中使用popen函数。按照我的理解,无论我在C中写入文件描述符什么,都可以从python程序的stdin中读取。但是,python程序似乎挂起在从stdin读取的位置。有什么建议吗

下面是C程序:

test.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(void) {

    FILE * fp = popen("sudo python display.py", "w");
    if (fp == NULL) {
        printf("popen error\n");
        exit(1);
    }

    int inc = 0;
    char buf[10];

    while(1) {
        sprintf(buf, "%d", inc);
        fputs(buf, fp);
        inc++;
        sleep(1);
    }


    return (0);
}
程序似乎挂起在value=sys.stdin.read()处。我也尝试过readline()和readlines(),但结果相同。

readline()
如果您从C程序输出行,则可以使用

由于从不打印换行符,
readline
将永远等待

不带参数的
read()
将等待C程序退出(或关闭stdout)。同样,这在您的程序中永远不会发生,您应该使用而不是将
sprintf
(这是不安全的,首选)与
fputs混用

您确实希望输出整行代码(因为它们非常方便调试)。并在Python端使用
readline

最后,由获得的
文件*
甚至不能保证是行缓冲的(但可能有更大的缓冲区,可能是4KB或更多)。您可以使用设置其缓冲区,但确实应该使用显式刷新
文件*
缓冲区。如果不这样做,输出可能会在缓冲区中停留很长时间(没有像
fprintf
fputs
这样的
stdio
函数所做的任何实际操作),因此输出将保持为空

(所以即使在C端也有问题)

程序似乎挂起在value=sys.stdin.read()处

我猜没有一个字节是由您的C代码实际编写的(您可以使用进行检查),因为您的
fputs
保留在缓冲区中。您可能需要等待很长时间(可能需要1000秒,以填充几千字节的缓冲区)才能让它在管道上实际写入内容,因为您忘记了
fflush

popen
-ed文件绝对应该是
pclose
d

因此,您应该将(不正确的)
while
循环替换为:

while(1) {
    fprintf(fp, "%d\n", inc);
    inc++;
    fflush(fp);
    sleep(1);
}
你的循环应该以某种方式退出。也许你会捕捉到一些——可能是
SIGTERM
(但一定要阅读)。确保
pclose
(以避免僵尸进程)


(我假设您使用的是Linux或其他POSIX系统)

但是在C端没有任何
fflush
,并且每秒只写入几个字节,OP需要等待很长时间才能发生某些事情。我猜Python进程在实践中永远不会得到一个字节(因为OP可能需要等待几百秒才能在其原始代码上实现这一点),谢谢!那帮我修好了
while(1) {
    fprintf(fp, "%d\n", inc);
    inc++;
    fflush(fp);
    sleep(1);
}