使用进程时程序挂起

2024-04-25 14:46:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将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

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


Tags: path代码fromtestif管道pid命名
1条回答
网友
1楼 · 发布于 2024-04-25 14:46:19

我手头上没有unix设备可以测试。但可能的问题是您没有在父进程中关闭fifo。你知道吗

每当您有一个类似for line in file的循环时,该循环将一直持续到文件结束。与普通文件不同,fifo在写入端的进程关闭fifo之前不会“结束”。如果不关闭fifo,读取过程将在读取调用中阻塞,无法继续。你知道吗

你的代码可能还有其他问题,我没有找到。你知道吗

其他注意事项:

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

  • 在第二个fifo上还有另外一个比赛条件,我认为这个条件不太可能像预期的那样起作用。

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

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

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

相关问题 更多 >