Чтение вывода из фонового процесса в C++

У меня есть фоновый процесс, который запускается в начале моей программы и генерирует выходные данные каждые 20 мс. В моей программе я хочу прочитать эти данные, но хотел бы избежать постоянной записи/чтения из файла, так как это может быть очень медленным.

Результатом каждой итерации является одна строка (максимальная длина ~ 100 символов), и мне нужны только самые последние данные в любой момент времени.

В идеале я мог бы использовать какой-то буфер в памяти для получения этих данных, но я не знаю, как это сделать. Я изучил использование popen (см. также: c++: вывод подпроцесса на стандартный ввод), однако похоже, что он используется для выполнения команды и ожидания одного вывода. Мой результат будет более или менее постоянно меняться. Я запускаю эту программу на Raspbian.


person mwaterbu    schedule 07.03.2013    source источник
comment
Просто погуглите различные методы межпроцессного взаимодействия   -  person Seth Carnegie    schedule 07.03.2013
comment
Это похоже на заголовок stackoverflow.com/questions/955962/   -  person Martin Kristiansen    schedule 07.03.2013


Ответы (2)



Используйте общую память: выделите память для данных, которыми вы хотите поделиться, и выделите второй сегмент для переменной мьютекса для обработки блокировки.

Пример кода с поплавком[9]:

сервер

int shmid, shmid_mutex;
key_t key = 1337, key_mutex = 1338;
float *shm;
pthread_mutex_t *shm_mutex;
int SHMSZ = sizeof(float[9]), SHMSZ_mutex = sizeof(pthread_mutex_t);

//Mutex shared memory
shmid_mutex = shmget(key_mutex, SHMSZ_mutex, IPC_CREAT | 0660); //Create the segment
shm_mutex = (pthread_mutex_t *)shmat(shmid_mutex, NULL, 0); //Attach the segment to data space
shmctl(shmid_mutex, SHM_LOCK, (struct shmid_ds *) NULL); //Lock this segment from being swapped

//Setup mutex attributes
pthread_mutexattr_t psharedm;
pthread_mutexattr_init(&psharedm);
pthread_mutexattr_setpshared(&psharedm, PTHREAD_PROCESS_SHARED);
//Initialize mutex
pthread_mutex_init(shm_mutex, &psharedm);

//Float array shared memory
shmid = shmget(key, SHMSZ, IPC_CREAT | 0660); //Create the segment
shm = (float *)shmat(shmid, NULL, 0); //Attach the segment to data space
shmctl(shmid, SHM_LOCK, (struct shmid_ds *) NULL); //Lock this segment from being swapped

float x = 0.1;
while(true)
{
    pthread_mutex_lock(shm_mutex); //start critical section
    //Write to shared memory
    for (int i = 0; i < 9; i++)
        shm[i] = x * i;
    x += 0.1;
    printf("W ");
    for (int i = 0; i < 9; i++)
        printf("%f ", shm[i]);
    printf("\n");
    usleep(100000); //slow down output to make it readable
    pthread_mutex_unlock(shm_mutex);  //end critical section
    usleep(10000); //wait for 10ms to simulate other calculations
}

клиент

int shmid, shmid_mutex;
key_t key = 1337, key_mutex = 1338;
float *shm;
pthread_mutex_t *shm_mutex;
int SHMSZ = sizeof(float[9]), SHMSZ_mutex = sizeof(pthread_mutex_t);

//Mutex shared memory
shmid_mutex = shmget(key_mutex, SHMSZ_mutex, IPC_CREAT | 0660); //Create the segment
shm_mutex = (pthread_mutex_t *)shmat(shmid_mutex, NULL, 0); //Attach the segment to data space
shmctl(shmid_mutex, SHM_LOCK, (struct shmid_ds *) NULL); //Lock this segment from being swapped

//Float array shared memory
shmid = shmget(key, SHMSZ, 0660); //Locate the segment
shm = (float *)shmat(shmid, NULL, 0); //Attach the segment to data space
shmctl(shmid, SHM_LOCK, (struct shmid_ds *) NULL); //Lock this segment from being swapped

while(true)
{
    pthread_mutex_lock(shm_mutex); //start critical section
    //Read from shared memory
    printf("R ");
    for (int i = 0; i < 9; i++)
        printf("%f ", shm[i]);
    printf("\n");
    usleep(100000); //slow down output to make it readable
    pthread_mutex_unlock(shm_mutex); //end critical section
    usleep(10000); //wait for 10ms to simulate other calculations
}
person mwaterbu    schedule 01.04.2013