2009-04-16 105 views
-3

運行此代碼時出現分段錯誤。我無法弄清楚爲什麼會發生這種情況 - 任何人都可以看到可能的原因? (我已經拿到並初始化信號量的共享內存)。爲什麼我使用此代碼獲得分段錯誤?

我的代碼:
#include<stdlib.h> 
    #include<sys/types.h> 
    #include<sys/shm.h> 
    #include<sys/ipc.h> 
    #include<stdio.h> 
    #include<sys/sem.h> 

    union semun 
    { 
    int val; 
    struct semid_ds *buf; 
    unsigned short *array; 
    } arg; 



    int main() 
    { 
    key_t semkey; 
    int shmid,semid,nsem,sops; 
    struct sembuf buf[1]; 

    char *ptrr,*shm,c,*s; 

    semkey=ftok("/home/mawia/abc.c",'a'); 

    printf("entered into main of producer\n"); 
    if(semkey<0) 
    { 
    perror("ftok"); 
    exit(1); 
    } 

    shmid=shmget(semkey,30,0777); 

    if(shmid<0) 
    { 
    printf("error"); 
    perror("shmget"); 
    exit(1); 
    } 

    shm=shmat(shmid,0,0); 
    if(shm==(char *) -1) 
    { 
    perror("shm"); 
    exit(1); 
    } 

    s=shm; 
    semid=semget(semkey,1,0777); 
if(semid<0) 
{ 
    printf("error"); 
    perror("semget"); 
    exit(0); 
} 

ptrr=shm+1; 
*s='w'; 
printf("going to check the value 0th semaphores\n"); 
buf[0].sem_num=0; 
buf[0].sem_op=0; 
    buf[0].sem_flg=0; 
buf[1].sem_num=0; 
buf[1].sem_op=1; 
buf[1].sem_flg=0; 
    printf("entered the critical region\n"); 
//printf("waiting to enter the buffer zone..."); 
semop(semid,buf,2); 

printf("entered the critical region\v"); 
if(*s!='r') 
{ 
    printf("\nPRODUCER IS PRODUCING\n\n\n"); 

    printf("ENTER DATA\n"); 

    while((c=getchar())!='\n') 
    { 
    *ptrr++=c; 
    } 
    *ptrr='\0'; 
    *s='r'; 
} 

    else 
    printf("RESOURCE IS FULL:CAN'T PRODUCE"); 

//printf("produced enough for the consumer \nexiting from the buffer area now..."); 
buf[0].sem_num=0; 
buf[0].sem_op=-1; 
buf[0].sem_flg=0; 

semop(semid,buf,1); 

ptrr=shm+1; 

    if(!strcmp(ptrr,"exit")) 
    { 
    printf("exiting..."); 
    exit(0); 
    } 
    sleep(1); 

return 0; 
    } 
+3

試着用調試器中運行,找出*,其中*你的代碼沒有。然後將其編輯爲合理的長度和更有針對性的問題。 – dmckee 2009-04-16 20:57:11

+3

你有沒有得到一個核心轉儲文件?嘗試用gdb打開它。 – Alan 2009-04-16 20:58:14

+0

@馬克英格拉姆:對不起,我毀了你的編輯。我試圖將這兩者結合到兩全其美的世界中(並且將你的「while」改變爲「while」!):P)。 – 2009-04-16 21:12:53

回答

13

一瞥(非常快),我會說,它可以由

struct sembuf buf[1]; 

/*some other code*/ 

buf[1].sem_num=0; 
buf[1].sem_op=1; 
buf[1].sem_flg=0; 

引起的後您正在訪問緩衝區之外的內存。 BUF [1]保留在堆棧中只有一個結構sembuf內存,你要使用2。在這種情況下,你應該使用

struct sembuf buf[2] 
2

數組分配太小。

這個例子通常太長以至於不被視爲一個好例子;嘗試找到複製錯誤的較小(最小是理想的)情況,尤其是依賴儘可能少的外部庫的情況。此外,請嘗試在調試器中運行並在詢問之前逐步完成代碼。

4

啊......顯然有一些非常錯誤的,當你聲明

struct sembuf buf[1]; 

但幾行後做

buf[1].sem_num=0; 
buf[1].sem_op=1; 
buf[1].sem_flg=0; 
相關問題