0

プログラムの開始時に開始されるバックグラウンド プロセスがあり、20 ミリ秒ごとに出力データが生成されます。私のプログラムでは、このデータを読み取りたいのですが、ファイルへの書き込み/読み取りが非常に遅くなる可能性があるため、ファイルへの書き込み/読み取りを常に実行することは避けたいと考えています。

すべての反復からの出力は単一の文字列 (最大長 ~ 100 文字) であり、いつでも最新のデータのみが必要です。

理想的には、ある種のメモリ内バッファを使用してこのデータを取得できますが、これを行う方法がわかりません。popen の使用を調べました (参照: c++: stdin へのサブプロセス出力)、ただし、これはコマンドを実行し、単一の出力を待機するために使用されるようです。私の出力は多かれ少なかれ常に変化します。このプログラムをRaspbianで実行しています。

4

2 に答える 2

0

stdout を stringstream にリダイレクトしたいと思います。ここに記載されています。

これと組み合わせる。

これで stdout がリダイレクトされ、別のプロセスに送信できるようになりました。

于 2013-03-07T04:53:52.947 に答える
0

共有メモリを使用する: 共有するデータにメモリを割り当て、ロックを処理するミューテックス変数に 2 番目のセグメントを割り当てます。

float を共有するコード例[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
}
于 2013-04-01T15:48:25.780 に答える