0

私はセマフォについて知っていると言わなければなりませんが、それらの使い方はまだわかりません。つまり、int lockが特定の値を取得したときに制御をデータセグメントに渡すのですが、この時点でコードを機能させるにはどうすればよいのでしょうか。この時点でコードがフリーズし、理由がわかりません...

sc(server)-最初に実行されます

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include "st.h"

int main(){
    int shmid,i;
    int w =1;
    struct msg* m;
    shmid = shmget(1271,sizeof(struct msg), IPC_CREAT|IPC_EXCL|0600);

    if(shmid == -1){
        perror("~~~Shmid");
        exit(1);
    }   
    m = shmat(shmid,0,0);
    printf("segment attached to structure");

    do{
    printf("waiting...");
    sleep(1);
    }while(m->lock != 1);

    if(m->lock == 1)
    printf("lock open!");

    shmdt(m);
return 0;
}

cc(クライアント)

int main(int argc, char *argv[]){
    if(argc != 2)
        perror("~~~ ./c [file name]");
        exit(1);
    int shmid;
    struct msg* m;
    shmid = shmget(1271,0,0);

    if(shmid == -1){
        perror("~~~Shmid");
        exit(1);
    }   
    m = shmat(shmid,0,0);

    m->f = *argv[1];
    m->lock = 1;

    shmdt(m);
return 0;
}

st.h

struct msg{
    char f[50];
    int lock;   
};
4

2 に答える 2

1

エラーは、クライアントのコードの先頭にあります。

int main(int argc, char *argv[]){
    if(argc != 2)
        perror("~~~ ./c [file name]");
        exit(1);
    int shmid;
    ...

perror()andexit()ステートメントを中括弧のブロック内に配置する必要があります。

現在のコードでは、exitステートメントが常に呼び出され、クライアントはメモリブロックに接続したり、ロックの値を変更したりせずに終了します。

于 2012-06-08T09:43:48.283 に答える
0

それは次のようになります。

data = shmat(shmid、(void *)0、0); //ポインタに注意
if(data ==(char *)(-1))
    perror( "shmat");
于 2012-06-07T20:01:07.927 に答える