我正在尝试将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,读取过程将在读取调用中阻塞,无法继续。你知道吗你的代码可能还有其他问题,我没有找到。你知道吗
其他注意事项:
您应该在execvp之前使用mkfifo,目前您正在并行执行它们,希望mkfifo在python程序尝试打开文件之前完成。可能,但不确定。
在第二个fifo上还有另外一个比赛条件,我认为这个条件不太可能像预期的那样起作用。
您永远不会删除命名管道,下次它将尝试创建一个已存在但无法工作的文件。
SIGKILL很少使用正确的信号。我建议您仔细阅读SIGKILL、SIGTERM等之间的区别。
像mkfifo这样的系统调用可能会失败,建议检查返回值是否有错误。
相关问题 更多 >
编程相关推荐