Ошибка сегментации с помощью 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 Machine, либо на подсистеме Ubuntu Windows 10, либо на обычной ОС, строка 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
И один из масок это:
0000
И большое спасибо всем за участие в этом посте!:)
РЕДАКТИРОВАТЬ, ПРОБЛЕМА РЕШЕННАЯ СПАСИБО Ахал и всем, оооочень большое спасибо:
- Одна из основных проблем заключалась в использовании umask 0022 вместо 0002, спасибо Ахалю за это решение.
-Второй проблемой было то, что я использовал подсистему Ubuntu для Windows и попытался запустить программу из CLI, пока она находилась на рабочем столе Windows, Windows, по-видимому, не дает права доступа для канала для рабочего стола.
-Решение было в том, чтобы переключиться на мою загрузку Ubuntu и сменить umask, и тогда все заработало отлично:)
Спасибо Achal и всем, кто участвовал в этом посте.
ЗАДАЧА РЕШЕНА.
1 ответ
mkfifo()
механизм IPC полезен для создания FIFO
для сообщения того же или другого процесса.
справочные страницы mkfifo()
говорит " mkfifo()
Системный вызов создает новый файл fifo с именем path. Права доступа определяются mode
а также restricted
посредством umask(2)
вызывающего процесса "
Как вы упомянули в комментариях в вашем терминале umask
значение было 0000
означает отсутствие разрешения, поэтому mkfifo() завершается ошибкой, поэтому измените значение umask с помощью CLI в соответствии с вашими требованиями.
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);
}
}
Как только значение umask установлено, запустите вашу программу.
Я надеюсь, что это очень помогло