mkfifo 的分段错误

Segmentation Fault with mkfifo

我遇到了以下代码的问题:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>


int main(int argc, char*argv[]){

    FILE * tube;
    char chaine[10];
    mkfifo("glue", 0666);
    tube = fopen("glue", "r");


    while(1){
        fgets(chaine, 10, tube);
        printf("%s\n", chaine);

    }

}

这是一个模仿服务器行为的程序,但是当我在我的 Ubuntu 机器上 运行 它时,Windows 10 Ubuntu 子系统或正常 OS,mkfifo行returns这个错误:

Segmentation Fault(core dumped)

请帮忙!

编辑:

忘记发送带mkfifo测试的版本:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>


int main(int argc, char*argv[]){

    FILE * tube;
    char chaine[10];
    int errValue = mkfifo("glue", 0666);
    perror("mkfifo");
    if( errValue < 0){
        printf("Error: %d\n", errValue);
        exit(EXIT_FAILURE);
    }
    tube = fopen("glue", "r");


    while(1){
        fgets(chaine, 10, tube);
        printf("%s\n", chaine);

    }

}

程序的输出是:

mkfifo: Operation not permitted
Error: -1

而 umask 之一是:

0000

非常感谢大家参与这个 post!!:)

编辑,感谢 achal 和大家解决了问题,非常感谢:

-一个问题,核心问题,是使用 0022 umask 而不是 0002,感谢 achal 提供此解决方案。

-第二个问题是我为 windows 使用 Ubuntu 子系统并尝试从 CLI 运行 程序位于 Windows 桌面上, windows 显然没有为桌面提供管道权限。

-解决方案是切换到我的 Ubuntu 引导并更改 umask 然后它完美地工作:)

感谢 achal 和所有参与本次活动的人 post。

问题已解决。

mkfifo() 是一种 IPC 机制,可用于创建用于通信相同或不同进程的 FIFO

mkfifo() 的手册页说 "The mkfifo() system call creates a new fifo file with name path. The access permissions are specified by mode and restricted by the umask(2) of the calling process"

正如您在终端的评论中提到的 umask 值是 0000 意味着没有权限,这就是 mkfifo() 失败的原因,因此请根据您的要求使用 CLI 修改 umask 值。

xyz@xyz-PC:~$ umask 0002
xyz@xyz-PC:~/s_flow$ umask
0002

并将您的代码修改为

int main(int argc, char*argv[]){

    FILE * tube;
    char chaine[10];
    int errValue = mkfifo("glue", 0666);
    perror("mkfifo");
    if( errValue < 0){
        printf("Error: %d\n", errValue);
        exit(EXIT_FAILURE);
    }
    tube = fopen("glue", "r");
    if(tube == NULL)
    {
     printf("error in opening file :\n");
     return 0;
    }
    while(1){
        fgets(chaine, 10, tube);
        printf("%s\n", chaine);

    }

}

设置 umask 值后,执行您的程序。

希望对大家有帮助