Чтение и запись с помощью именованных каналов C

Я пишу программу, которая должна работать бесконечно, сохраняя значение переменной. Две другие программы могли изменить значение переменной. Я использую именованные каналы для получения и отправки значения переменной во внешние программы.

Вот мой код для менеджера переменной.

manager.c:

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pthread.h>

char a = 'a';

void *editTask(void *dummy)
{
    int fd;
    char* editor = "editor";
    mkfifo(editor, 0666);
    while(1)
    {
        fd = open(editor, O_RDONLY);
        read(fd, &a, 1);
        close(fd);
    }   
}

void *readTask(void *dummy)
{
    int fd;
    char* reader = "reader";
    mkfifo(reader, 0666);
    while(1)
    {
        fd = open(reader, O_WRONLY);
        write(fd,&a,1);
        close(fd);      
    }
}

int main()
{
    pthread_t editor_thread, reader_thread;
    pthread_create(&editor_thread, NULL, editTask, NULL);
    pthread_create(&reader_thread, NULL, readTask, NULL);
    pthread_join (editor_thread, NULL);
    pthread_join (reader_thread, NULL);
    return 0;
}

Эта программа использует pthreads для отдельного получения внешних значений переменной и для передачи текущего значения переменной внешним программам.

Программа, которая может записывать значения в переменную:

писатель.c:

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    if(argc != 2)
    {
    printf("Need an argument!\n");
    return 0;
    }           
    int fd;
    char * myfifo = "editor";
    fd = open(myfifo, O_WRONLY);
    write(fd, argv[0], 1);      
    close(fd);

    return 0;
}

Программа, которая может прочитать текущее значение:

reader.c:

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    int fd;
    char * myfifo = "reader";
    fd = open(myfifo, O_RDONLY);
    char value = 'z';
    read(fd, &value, 1);
    printf("The current value of the variable is:%c\n",value);      
    close(fd);

    return 0;
}

Я запускал эти программы в своей системе Ubuntu следующим образом:

$ ./manager &
[1] 5226
$ ./writer k
$ ./reader
bash: ./reader: Text file busy

Почему моя система не позволяет мне запустить эту программу?

Спасибо.


person user5393678    schedule 09.12.2016    source источник


Ответы (1)


Вы пытаетесь назвать как FIFO, так и программу чтения «читателем».

Кроме того, у вас нет проверки ошибок. Вы понятия не имеете, были ли эти вызовы mkfifo и open успешными или нет. Добавление этого имеет решающее значение, прежде чем вы попытаетесь устранить неполадки.

person David Schwartz    schedule 09.12.2016
comment
Виноват. Я все перерыл, но не нашел этой ошибки. Я думал, что где-то может быть ограничение, когда процесс пытается читать и писать в каналы параллельно. А что касается проверки ошибок, какая проверка ошибок имеет решающее значение? Я имею в виду, что почти все функции можно проверить на наличие ошибок, и я не могу заморачиваться со всеми ими. И спасибо за ваш совет по проверке ошибок. Я буду иметь это в виду. - person user5393678; 09.12.2016
comment
@user5393678 user5393678 Любая функция, которая имеет реальную вероятность сбоя, должна вызываться с проверкой ошибок. Это почти все из них. Ясно, что это open, mkfifo, read и write, поскольку они все время терпят неудачу по самым разным причинам. И это почти не проблема, это просто вырезать и вставить if/perror (или использовать макрос). И, честно говоря, было ли меньше беспокойства в попытке устранить неполадки с завязанными глазами, не зная, где программа дает сбой? - person David Schwartz; 09.12.2016