Использование fork() с plainTextEdit
Хочу просто добавить любой текст в 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>
Много лишних библиотек есть я знаю
Источник: Stack Overflow на русском