Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mkfifo的分段故障_C_Segmentation Fault_Mkfifo - Fatal编程技术网

C mkfifo的分段故障

C mkfifo的分段故障,c,segmentation-fault,mkfifo,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 =

我对以下代码有问题:

#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);

    }

}
请帮忙

编辑:

忘记发送带有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);

    }

}
umask的一个是:

0000
非常感谢大家参与这个帖子!!:)

编辑,问题解决感谢achal和所有人,非常感谢:

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

-第二个问题是我使用Ubuntu子系统运行windows,并尝试从CLI运行程序,而该程序位于windows桌面上,windows显然不授予桌面的管道权限

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

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

问题已解决。

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

mkfifo()

正如您在终端
umask
中的注释中所提到的,值was
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);

    }

}
intmain(intargc,char*argv[]){
锉刀*管;
碳链[10];
int errValue=mkfifo(“胶水”,0666);
佩罗(“mkfifo”);
如果(错误值<0){
printf(“错误:%d\n”,errValue);
退出(退出失败);
}
管=fopen(“胶水”,“r”);
if(tube==NULL)
{
printf(“打开文件时出错:\n”);
返回0;
}
而(1){
fgets(链,10,管);
printf(“%s\n”,链);
}
}
设置umask值后,执行程序


我希望它能帮助lot

生成一个核心转储,然后对其进行分析。我不确定是
mkfifo
导致分段错误,更可能是后面的行。但是,您没有检查
mkfifo
的返回值(在用C编程时这是一个很大的错误,因为这是处理错误的唯一方法),因此无法保证函数调用本身是否成功。与
fopen
相同,不能保证它不会
NULL
。很可能
mkfifo
失败,然后在尝试打开不存在的fifo时出现错误。您可能在没有写入权限的目录中运行程序,因此
mkfifo
失败。我不同意
f*()
-文件函数不适用于FIFO,您为什么这么认为?分段错误很可能是由于
fopen()
失败和随后的
fgets()
取消引用空指针造成的。我对文章进行了编辑,并添加了mkfifo返回的代码错误,请检查编辑后的部分。使用修改后的代码,但是我得到了这个输出:/mkfifo:操作不允许错误:-1使用CLI修改umask值。如果是0000,它将如何允许创建fifo文件。。应该是0002
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);

    }

}