Ошибка сегментации с помощью 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 установлено, запустите вашу программу.

Я надеюсь, что это очень помогло

Другие вопросы по тегам