gpt4 book ai didi

python - 使用进程时程序挂起

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:39 24 4
gpt4 key购买 nike

我正在尝试将我的 C 代码与我的 Python 代码进行通信。我在我的 c 代码中制作了一个名称管道,将其发送到 python,然后 python 将其打印出来。我想在 python 中创建一个命名管道并用 c 读出它的地方做同样的事情,但是我的程序似乎停滞了(我想同时执行这两个操作),因此我正在使用进程。

我的 C 代码:

int main(void) {
int pid;
FILE * fp;
char *calledPython="./a.py";
char *pythonArgs[]={"python",calledPython,"a","b","c",NULL};
FILE * fp2;
char str[40];
pid = fork();

if(pid == 0) {
mkfifo("./test",0666);
fp = fopen("./test","w");
fprintf(fp,"Hello\n");
fprintf(fp,"World\n");
}
else {
execvp("python",pythonArgs);
// if we get here it misfired
perror("Python execution");
kill(pid,SIGKILL);
}

fp2 = fopen("./test2","r");
if(fp2 == NULL) {
printf("NUll\n");
}

else {
fscanf(fp2, "%s", str);
printf("received from test2 %s\n", str);
}
fclose(fp);
return 0;
}

我的 python 代码:

#!/usr/bin/python


import os, sys

with open("./test") as fp:
for line in fp:
print line


path = "./test2"
os.mkfifo(path)

fifo = open(path,"w")
fifo.write("Message from the sender\n")
fifo.close()

其中 ./test 是初始命名管道,python 读入而 ./test2 是第二个命名管道 c soposed 读入。但是,一旦我用 python 写入第二个管道,我的程序就会挂起:

path = "./test2"
os.mkfifo(path)

fifo = open(path,"w")
fifo.write("Message from the sender\n")
fifo.close()

我从终端得到的输出是:

NUll
Hello

World

如果我再次运行它,我只会得到一个空行(根本不打印任何内容)。我试图在父进程中打开第二个命名管道,这似乎没有太大变化。我不确定这里哪里出了问题,有什么想法吗?

最佳答案

目前我手头没有可测试的 unix 机器。但是可能的问题是你没有在父进程中关闭 fifo。

只要你有一个像for line in file 这样的循环,这个循环就会一直持续到文件结束。与普通文件不同,fifo 在写入端的进程关闭 fifo 之前不会“结束”。如果不关闭 fifo,读取过程将阻塞在 read 调用中,无法继续进行。

您的代码可能还有其他我遗漏的问题。

一些其他注意事项:

  • 您应该在执行 execvp 之前执行 mkfifo,目前您正在并行执行它们并希望 mkfifo 在您的 python 程序尝试打开文件之前完成。可能,但不确定。

  • 第二个 fifo 上还有另一个竞争条件,我认为这个条件不太可能按预期工作。

  • 您永远不会删除命名管道,下次它会尝试创建一个已经存在的文件,该文件将无法工作。

  • SIGKILL 很少使用正确的信号。我建议您仔细阅读 SIGKILL、SIGTERM 等之间的区别。

  • 像 mkfifo 这样的系统调用可能会失败,建议检查返回值是否有错误。

关于python - 使用进程时程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39958815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com