c-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("%sn", 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: %dn", errValue);
exit(EXIT_FAILURE);
}
tube = fopen("glue", "r");

while(1){
fgets(chaine, 10, tube);
printf("%sn", chaine);
}
}

程序的输出为:

mkfifo: Operation not permitted
Error: -1

umask的一个是:

0000

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

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

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

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

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

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

问题解决了。

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

mkfifo()的手册页上写着"mkfifo()系统调用创建一个名为path的新fifo文件。访问权限由moderestricted由调用进程的umask(2)指定">

正如您在终端中的注释中提到的,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: %dn", 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("%sn", chaine);
}
}

一旦设置了umask值,就执行您的程序。

我希望这对有很大帮助

相关内容

  • 没有找到相关文章

最新更新