2009-04-16 3 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

+3

Получили ли вы файл дампа ядра? Попробуйте открыть это с помощью gdb. – Alan

+0

@ Mark Ingram: Извините, я сбил ваши изменения. Я попытался объединить эти два в лучших из обоих миров (и вернул ваше изменение «while» на «while»!: P). –

ответ

13

После быстрого взгляда (очень быстро), я бы сказал, что это может быть вызвано

struct sembuf buf[1]; 

/*some other code*/ 

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

Вы обращаетесь к памяти за пределами буфера. ЬиЙ [1] сохраняет память в стеке для только одной структуры sembuf, вы пытаетесь использовать 2. В этом случае, вы должны использовать

struct sembuf buf[2] 
+0

+1 Возможно, вы удалите buf [0] из своего кода, чтобы показать, что «плохим» кодом является тот, который получает ошибку [1]. – lothar

+0

Уверенный, делает его более ясным. Благодарю. – Tom

+1

действительно очень спасибо брату. вот почему. Очень благодарю за это. спасибо всем за ответ. – mawia

2

выделения массива слишком мало.

Этот пример, как правило, слишком длинный, чтобы считаться хорошим примером; попробуйте найти меньший (минимальный идеальный) случай, который реплицирует ошибку, особенно ту, которая зависит от как можно большего количества внешних библиотек. Кроме того, попробуйте запустить в отладчике и выполнить код перед запросом.

4

Ах ... есть, очевидно, что-то очень неправильно, когда вы объявляете

struct sembuf buf[1]; 

но несколько строк позже сделать

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

спасибо за ответ брата. спасибо, что указал. – mawia

Смежные вопросы