为什么这个程序在 ubuntu windows 桌面应用程序和 ubuntu 虚拟框上给出不同的输出?

Why does this program give different outputs on ubuntu windows desktop app and on ubuntu virtual box?

该程序基本上是在检查 fcntl 函数的工作原理。主程序(Pm.c)通过fork创建了一个管道和3个子进程。然后它在管道上执行必要的 fcntl 函数,然后写入它。 子进程在 ubuntu 虚拟框中收到来自管道的信号后终止,但它们在 ubuntu windows 应用程序中没有收到任何信号。

Pm.c -

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>

int main()
{
    int c = getpid(), c1, c2, c3;
    int pp[2];
    pipe(pp);
    char *args[1];
    args[0] = NULL;

    if((c1 = fork()) == 0)
        execvp("./p1", args);
    if((c2 = fork()) == 0)
        execvp("./p2", args);
    if((c3 = fork()) == 0)
        execvp("./p3", args);

    setpgid(0, 0);
    setpgid(c1, c);
    setpgid(c2, c);
    setpgid(c3, c);

    printf("%d %d %d %d\n", c, c1, c2, c3);
    printf("%d %d %d %d\n", getpgid(c), getpgid(c1), getpgid(c2), getpgid(c3));
    int gid = getpgid(c);

    sleep(1);

    fcntl(pp[0], F_SETFL, O_ASYNC);
    fcntl(pp[0], __F_SETSIG, SIGUSR1);
    fcntl(pp[0], F_SETOWN, -gid);

    write(pp[1], "bruh ", 4);
    close(pp[1]);
    wait(NULL);

    return 0;
}

P1.c(P2.c和P3.c类似这个)

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int pr = 1;

void hdfn(int x)
{
    printf("Recieved signal from pm\n");
    pr--;
}

int main()
{
    signal(SIGUSR1, hdfn);
    printf("P1 is running\n");
    while(pr);
    return 0;
}

这是 Ubuntu virtual Box 中的输出。程序终止并且是正确的输出 -

1846 1847 1848 1849
1846 1846 1846 1846
P1 is running
P2 is running
P3 is running
Recieved signal from pm
Recieved signal from pm
Recieved signal from pm
User defined signal 1

在 ubuntu windows 应用程序上输出。 (程序不会终止)-

26 27 28 29
26 26 26 26
P1 is running
P2 is running
P3 is running

谁能告诉我为什么输出不同,以及我如何在 ubuntu 应用程序上获得正确的输出。

这是因为 fcntl 在 linux 的 windows 子系统上不存在。我希望你的 "ubuntu windows app" 是 this app. Your code is compiling because headers exist but fcntl is not supported. See this github issue