使用管道将数据从C进程发送到Python进程
我试图将数据从C程序发送到python程序(两者同时运行)。我试图在C中使用popen函数。按照我的理解,无论我在C中写入文件描述符什么,都可以从python程序的stdin中读取。但是,python程序似乎挂起在从stdin读取的位置。有什么建议吗 下面是C程序: test.c使用管道将数据从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
#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);
}