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
中的注释中所提到的,值was0000
表示没有权限,这就是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);
}
}