2

このコードには 1 つの問題があります。1 つの構造を作成し、それを親から作成された 5 つの新しいプロセスで共有する必要があります。

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <time.h>

struct compartido {
    int pid1, pid2, pid3, pid4, pid5;   
    int propietario;            
    int contador;                   
    int pidpadre;
};

struct compartido var;  


int main(int argc, char *argv[]) {

    key_t llave1,llavesem;
    int idmem,idsem;    
    llave1=ftok("/tmp",'a');

    idmem=shmget(llave1,sizeof(int),IPC_CREAT|0600);
    if (idmem==-1) {
       perror ("shmget");
       return 1;
    }

var=shmat(idmem,0,0); /*This line is giving the error*/

/*rest of the code*/
}

正確なエラーは次のとおりです: エラー: タイプ 'void *' からタイプ 'struct compartido' に割り当てるときに互換性のないタイプ

6 つのプロセス (5 人の子供と父親) からのすべてのデータを表示および変更できるようにするには、この構造を共有変数に入れる必要があります。

私が悪いことをしている?よろしくお願いいたします。

4

4 に答える 4

2

おそらくポインタを宣言する必要があります

 struct compartido* var; 

次に、それを初期化します

 var= (struct compartido*) shmat(idmem,0,0); 

エラーケースを処理する必要があります

 if ((void*)var == (void*)-1) {
    perror("shmat failed");
    exit(1);
 }

shmat (2)は (Linux では)失敗する可能性のあるシステムコールであるためです。

最後に、ポインター フィールド表記を使用してフィールドにアクセスしvar->propietarioますvar->pidpatre

于 2012-09-10T15:35:57.767 に答える
1

構造体varに、void *であるshmat()の戻り値を割り当てようとしています。

間接参照が欠落しているのではないかと思いますか?

[より精巧なBasileの「スナップ」投稿を参照してください]

于 2012-09-10T15:37:45.017 に答える
0

構造体変数へのポインタを割り当てています。私は次のことをします:

idmem=shmget(llave1,sizeof(struct compartido),IPC_CREAT|0600);
if (idmem==-1) {
   perror ("shmget");
   return 1;
}
struct compartido *var=shmat(idmem,0,0);

この例では、structcompartidoサイズよりも小さいサイズを割り当てていることに注意してください。

于 2012-09-10T15:39:09.140 に答える
0

ええ、あなたがしていることは悪いです:

この行は構造を宣言しています -

struct compartido var;  

次に、それにポインターを割り当てます。

var=shmat(idmem,0,0); //returns a void*

shmatの仕組みをチェックアウト

于 2012-09-10T15:42:08.093 に答える