繁体   English   中英

从C子进程读取数据时Python挂起

[英]Python hang when reading data from C subprocess

我有一个Python GUI,它将在启动时打开C子进程,并在关闭时杀死C子进程。

正确捕获了从python发送到C以及从C到python发送的信号。 但是,在python端接收数据时存在一些问题。

这是我的程序:

Python代码:

fpi_c = subprocess.Popen(["./FPI_sig"],stdin=subprocess.PIPE,stdout=subprocess.PIPE)

def handle_inform_from_c(signum, frame):

    print("receved:", signum)

    outstr = fpi_c.stdout.read()

    print outstr

signal.signal(signal.SIGUSR1, handle_inform_from_c)

def gui_sense_and_save_fpi_2():

    fpi_c.stdin.write(str(123)+"\n")

    os.kill(fpi_c.pid,signal.SIGUSR1)

,其中gui_sense_and_save_fpi_2用一个按钮连接。 按下按钮后,数据和信号SIGUSR1将被发送到C子进程。

C代码:

void signal_callback_handler2(int signum)
{

    int gpid;
    scanf("%d",&gpid);

    printf("Caught signal %d\n",signum);
    //fclose(stdout);

    signal(SIGUSR1, signal_callback_handler2);
    kill(getppid(),SIGUSR1);

}

int main()
{

     signal(SIGUSR1, signal_callback_handler2);
     while(1)
     {
        sleep(0.5);
     }
     return EXIT_SUCCESS;
}

如果我添加fclose(stdout) ,我可以捕获由C在python结尾打印的消息"Caught signal XXX"

但是,关闭stdout会使PIPE损坏,我无法再发送数据。

如果没有fclose(stdout) ,程序将挂在outstr = fpi_c.stdout.read()

我已经在C中的printf和python中的fpi_c.stdin.flush() fflush(stdout)之后尝试了fflush(stdout) ,但是它仍然挂起。

挂起时,如果我强制任务管理器关闭C进程,则可能会在python端捕获消息。

似乎python正在等待C的终止。

但是,除非Python GUI关闭,否则我不希望关闭C进程。

如何正确发送和接收数据?

谢谢。

可以使用fflush刷新输出流,而不是fclose输出流,以便将缓冲区中的内容写出,并且父进程可以读取它:

printf("Caught signal %d\n", signum);
fflush(stdout);

终于找到解决办法了……

如果Python尝试从空缓冲区读取数据,在这种情况下,它将等待C的输入并挂起。

原始代码中应解决两个问题:

  1. printf之后添加fflush(stdout)

    否则,除非调用fflush(stdout) ,否则输出将被缓冲并且不会实际写入。

  2. Python需要知道应该读取多少个字符或多少行。

    不要使用fpi_c.stdout.read() 这将等待C输入并挂起。 而是使用fpi_c.stdout.read(1)读取1个字符,或使用fpi_c.stdout.readline()读取1行。

这样的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM