首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用mkfifo分割故障

用mkfifo分割故障
EN

Stack Overflow用户
提问于 2017-11-16 18:06:26
回答 1查看 798关注 0票数 2

下面的代码有问题:

代码语言:javascript
复制
#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行都会返回以下错误:

代码语言:javascript
复制
Segmentation Fault(core dumped)

救命啊!

编辑:

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

代码语言:javascript
复制
#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);

    }

}

程序的输出是:

代码语言:javascript
复制
mkfifo: Operation not permitted
Error: -1

而umask的一个是:

代码语言:javascript
复制
0000

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

编辑,问题解决了多亏了阿哈尔和大家,非常感谢你:

-One问题,核心问题,是使用0022 umask而不是0002,谢谢您的解决方案。

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

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

感谢阿哈尔和所有参与这篇文章的人。

问题解决了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 18:26:25

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

mkfifo()的手册页说:“mkfifo()系统调用创建了一个新的具有名称路径的fifo文件。访问权限由调用进程的moderestricted指定。”

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

代码语言:javascript
复制
xyz@xyz-PC:~$ umask 0002
xyz@xyz-PC:~/s_flow$ umask
0002

并将代码修改为

代码语言:javascript
复制
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值后,执行您的程序。

我希望这对罗得有帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47336421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档