Как запустить процесс из другого процесса в Linux? - PullRequest
0 голосов
/ 08 февраля 2019

Я занимаюсь разработкой приложения на C для Linux.Чтобы прояснить ситуацию, я перевел свою проблему в две простые программы:

  • Prog1: создает файл и запускает бесконечный цикл для чтения из него
  • Prog2: пишет слово «Hello"в файл 10 раз

Всякий раз, когда слово записывается в файл, бесконечный цикл в Prog1 обнаруживает его и просто читает.(Оба кода упоминаются в конце).

Проблема в том, что Prog1 на самом деле пытается прочитать слово, затем спит в течение 1 секунды, прежде чем пытаться читать снова.Я хочу, чтобы Prog1 прочитал слово «Hello», как только оно записано в файл (в режиме реального времени), и, если возможно, я бы хотел избавиться от бесконечного цикла while в Prog1.

Есть ли профессиональное решение этой проблемы?как специальное высокоприоритетное прерывание для запуска Prog1 из Prog2?

Спасибо.

/* Prog1 */
#define FIFO_FILE "MYFIFO"
int main (void)
{
    int fd;
    int read_bytes;
    char buf[6];

    mknod(FIFO_FILE, S_IFIFO|0640,0);

    while(1)
    {
        fd = open(FIFO_FILE, O_RDONLY);

        read_bytes = read(fd, buf, sizeof(buf));
        if(read_bytes == 0)
            break;

        buf[read_bytes] = '\0';

        printf("Received string is : %s \n", buf);

        sleep(1);
    }

    close(fd);

    return 0;
}

/* Prog2 */
#define FIFO_FILE "MYFIFO"
int main (void)
{
    int fd;
    int stringlen;
    int count = 0;
    char buf[6]={'H','e','l','l','o'};

    fd = open(FIFO_FILE, O_CREAT|O_WRONLY);

    while(count <= 10)
    {   
        stringlen = strlen(buf);
        buf[stringlen] = '\0';

        write(fd, buf, strlen(buf));
        printf("Sent String \n");

        count++;

        sleep(1);

    }

    close(fd);

    return 0;
}

1 Ответ

0 голосов
/ 08 февраля 2019

То, что вы пытаетесь сделать, это то, что делает команда tail -f.Вы можете просмотреть его исходный код , чтобы увидеть профессиональное решение.

С другой стороны, вы не должны использовать sleep, а poll из библиотеки сокетов.

...