如何在Linux中从另一个进程触发一个进程?

3
我正在Linux上开发C应用程序。为了更清楚地说明问题,我将我的问题翻译成了两个简单的程序:
Prog1:创建一个文件并运行一个无限循环以从中读取内容
Prog2:将单词“Hello”写入文件10次
每当单词被写入文件时,Prog1中的无限循环就会检测到它并简单地读取它。(这两段代码在文章末尾提到)
问题是:实际上,Prog1会尝试读取该单词,然后在尝试再次读取之前等待1秒钟。我希望Prog1能够实时读取单词“Hello”,如果可能的话,我想摆脱Prog1中的无限while循环。
有没有专业的解决方案来解决这个问题?比如使用特殊的高优先级中断来从Prog2触发Prog1?
谢谢。
/* Prog1 */
#define FIFO_FILE "MYFIFO"
int main (void)
{
    int fd;
    int read_bytes;
    char buf[6];

    mknod(FIFO_FILE, S_IFIFO|0640,0);

    while(1)
    {
        fd = open(FIFO_FILE, O_RDONLY);

        read_bytes = read(fd, buf, sizeof(buf));
        if(read_bytes == 0)
            break;

        buf[read_bytes] = '\0';

        printf("Received string is : %s \n", buf);

        sleep(1);
    }

    close(fd);

    return 0;
}

/* Prog2 */
#define FIFO_FILE "MYFIFO"
int main (void)
{
    int fd;
    int stringlen;
    int count = 0;
    char buf[6]={'H','e','l','l','o'};

    fd = open(FIFO_FILE, O_CREAT|O_WRONLY);

    while(count <= 10)
    {   
        stringlen = strlen(buf);
        buf[stringlen] = '\0';

        write(fd, buf, strlen(buf));
        printf("Sent String \n");

        count++;

        sleep(1);

    }

    close(fd);

    return 0;
}

1
我认为管道或命名管道更适合此目的,甚至可以使用套接字与selectpoll函数结合使用。 - Aconcagua
你可以发送一个信号来唤醒另一个进程。http://man7.org/linux/man-pages/man7/signal.7.html - stark
1个回答

5
你想要做的就是类似于命令tail -f的功能。你可以查看它的源代码来了解专业的解决方案。
另一方面,你不应该使用sleep,而应该使用socket库中的poll

旁注:如果可用,GNU tail 使用 inotify 而不是 poll。 - hek2mgl
如果inotify被禁用,我认为它会使用poll替代。正如我在这里看到的:https://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/,只有在`read`传递文件系统描述符时才有效--任何类型的文件描述符都不接受此操作。 - alinsoar
谢谢您的回答。我会花些时间更详细地调查它。然而,看起来这个命令只处理文件。如果Prog2将消息“Hello”写入共享内存而不是文件,怎么办?一旦单词被写入内存,我如何触发Prog1? - Kalkhouri
@Kalkhouri 正确。在你学完关于 poll 的教程之后,可以阅读一个专业的 tail 实现,然后再阅读在内核中是如何实现 poll 的,并实现自己的 poll 版本以了解 tail 的细节。 - alinsoar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接