Использование fork() с plainTextEdit

Рейтинг: 0Ответов: 0Опубликовано: 05.06.2023

Хочу просто добавить любой текст в plainTextEdit в процессе родителе и в дочернем процессе, т. к. plainTextEdit это общий ресурс, нужно синхронизировать взаимодействие процессов через семафор, вроде все должно работать, но не тут то было. При нажатии на кнопку записывается паралельно и одновременно два текста. Почему-то семафор не может справиться с этим. Пробовал через мютекс и там тоже самое было. В общем вот код:

void MainWindow::on_pushButton_clicked()
{
    QSystemSemaphore sem("market", 1, QSystemSemaphore::Create);

    for (int i = 0; i < 1; i++) {
        pid_t pid = fork();

        if (pid == 0) {
            char resultString[100];
            sprintf(resultString, "Дочерний процесс: %d\n", getpid());

            QString text = resultString;

            sem.acquire();

            ui->plainTextEdit->appendPlainText(text);

            sem.release();

            break;
        } else if (pid > 0) {
            char resultString[100];
            sprintf(resultString, "Родительский процесс: %d\n", getpid());

            QString text = resultString;

            sem.acquire();

            ui->plainTextEdit->appendPlainText(text);

            sem.release();

            break;
        } else {
            QString errorText = "Ошибка при вызове fork()\n";
            ui->plainTextEdit->appendPlainText(errorText);
        }
    }
} 

Библиотеки: 
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

#include <QPlainTextEdit>
#include <QTextStream>
#include <QCoreApplication>

#include <QSemaphore>
#include<QSystemSemaphore>  

Много лишних библиотек есть я знаю

Ответы

Ответов пока нет.