gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:57:07 27 4
gpt4 key购买 nike

该程序基本上是检查 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 应用程序”是 this app .您的代码正在编译,因为 header 存在但 fcntl不支持。看到这个github issue .

关于c - 为什么这个程序在 ubuntu windows 桌面应用程序和 ubuntu 虚拟盒子上给出不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59592823/

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