使用mkfifo进行分段错误

时间:2017-11-16 18:06:26

标签: c segmentation-fault 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子系统还是普通操作系统,mkfifo行都会返回此错误:

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

非常感谢大家参与这篇文章!! :)

编辑,问题解决了感谢所有人,谢谢你们太多了:

- 核心问题之一是使用0022 umask而不是0002,感谢这个解决方案。

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

- 解决方案是切换到我的Ubuntu启动并更改umask,然后它完美运行:)

感谢achal和参与这篇文章的所有人。

问题已解决。

1 个答案:

答案 0 :(得分:1)

mkfifo()是一种IPC机制,可用于创建FIFO来传达相同或不同的进程。

mkfifo()的手册页说“mkfifo()系统调用会创建一个带有名称路径的新fifo文件。访问权限由mode指定,restricted指定{ {1}}调用过程“

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

0000

并将您的代码修改为

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

设置umask值后,执行程序。

我希望它有所帮助