2015-04-28 32 views
-1

編輯:現在我知道錯誤是在主函數 如果我刪除:分段故障11我不知道爲什麼

*A=0; 
*NH=0; 
*NS=0; 
*in_boat=0; 

,然後我運行它沒有段錯誤,爲什麼會這樣?

下面的代碼返回分段錯誤11..i不知道爲什麼:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <semaphore.h> 
#include <sys/stat.h> 
#include <sys/shm.h> 
#include <sys/wait.h> 
#include <time.h> 

//--------------------Function declarations 
void hacker_pier(int x); 
void serf_pier(int x); 


//--------------------Global variables 
sem_t *sem_var, *sem_entry_pier, *sem_start_row, *sem_board_h, *sem_board_s, *sem_row_finished, *sem_file;//Semaphores 
int *A,*I,*NH,*NS,*in_boat;//Count variables 
int H,S,R,P;//User input variables 
FILE *fp;//File pointer 


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

    int pid, pid2, pid3, pid4;//IDs for processes 
    int id_sem_var, id_sem_entry_pier, id_sem_start_row, status, id_sem_board_h, id_sem_board_s, id_sem_row_finished, id_sem_file;//IDs for shared memory segment for semaphores  
    int id_I_hacker, id_I_serf, id_NH, id_NS, id_in_boat, id_A;//IDs for shared memory segment for counter variables 
    int i,x,y;//Temp variables 

    srand(time(NULL));//Seeding random function 

    P = atoi(argv[1]);//retrieving values from command line 
    H = atoi(argv[2]); 
    S = atoi(argv[3]); 
    R = atoi(argv[4]); 


    if((argc!=5)||(P==0 || P%2!=0)|| (H<0 || H>5000)|| (S<0 || S>5000)|| (R<0 || R>5000))//Checking validity of user input 
    { 
     fprintf(stderr,"Invalid value of argument\n"); 
     return 1; 
    } 

    H*=1000;//converting miliseconds to micro seconds, usleep() takes micro seconds as argument 
    S*=1000; 
    R*=1000; 

    fp = fopen("rivercrossing.out","w");//Opening file 

    if(fp==NULL) 
    { 
     fprintf(stderr,"Unable to access rivercrossing.out\n");  
     return 2; 
    } 




//--------------------Creating shared memory segment of semaphores 
    id_sem_var = shmget(IPC_PRIVATE, sizeof(sem_t), (S_IRUSR|S_IWUSR)); 
    id_sem_entry_pier = shmget(IPC_PRIVATE, sizeof(sem_t), (S_IRUSR|S_IWUSR)); 
    id_sem_start_row = shmget(IPC_PRIVATE, sizeof(sem_t), (S_IRUSR|S_IWUSR)); 
    id_sem_board_h = shmget(IPC_PRIVATE, sizeof(sem_t), (S_IRUSR|S_IWUSR)); 
    id_sem_board_s = shmget(IPC_PRIVATE, sizeof(sem_t), (S_IRUSR|S_IWUSR)); 
    id_sem_file = shmget(IPC_PRIVATE, sizeof(sem_t), (S_IRUSR|S_IWUSR)); 
    id_sem_row_finished = shmget(IPC_PRIVATE, sizeof(sem_t), (S_IRUSR|S_IWUSR)); 

    sem_var = (sem_t *)shmat(id_sem_var, NULL, 0); 
    sem_entry_pier = (sem_t *)shmat(id_sem_entry_pier, NULL, 0); 
    sem_start_row = (sem_t *)shmat(id_sem_start_row, NULL, 0); 
    sem_board_h = (sem_t *)shmat(id_sem_board_h, NULL, 0); 
    sem_board_s = (sem_t *)shmat(id_sem_board_s, NULL, 0); 
    sem_row_finished = (sem_t *)shmat(id_sem_row_finished, NULL, 0);  
    sem_file = (sem_t *)shmat(id_sem_file, NULL, 0); 


//--------------------Creating shared memory segment of counters 
    id_A = shmget(IPC_PRIVATE, sizeof(int), 0777|IPC_CREAT); 
    id_I_hacker = shmget(IPC_PRIVATE, sizeof(int), 0777|IPC_CREAT); 
    id_I_serf = shmget(IPC_PRIVATE, sizeof(int), 0777|IPC_CREAT); 
    id_NH = shmget(IPC_PRIVATE, sizeof(int), 0777|IPC_CREAT); 
    id_NS = shmget(IPC_PRIVATE, sizeof(int), 0777|IPC_CREAT); 
    id_in_boat = shmget(IPC_PRIVATE, sizeof(int), 0777|IPC_CREAT); 


    A = (int *) shmat(id_A, 0, 0); 
    NH = (int *) shmat(id_NH, 0, 0);  
    NS = (int *) shmat(id_NS, 0, 0);  
    in_boat = (int *) shmat(id_in_boat, 0, 0); 

//--------------------Initializing semaphores 
    sem_init(sem_var,1,1); 
    sem_init(sem_entry_pier,1,1); 
    sem_init(sem_start_row,1,0); 
    sem_init(sem_row_finished,1,0); 
    sem_init(sem_board_s,1,0); 
    sem_init(sem_board_h,1,0); 
    sem_init(sem_file,1,1); 



    sem_wait(sem_var); 
//--------------------Initializing counters 
    *A=0; 
    *NH=0; 
    *NS=0; 
    *in_boat=0; 


    return 0; 
} 

這實現了被稱爲rivercrossing同步問題。

我編譯gcc rivercrossing.c -o rc它和運行,如:./rc 2 2 2 200 其中第一2是在每個類別(農奴,黑客),第二和第三2產生的人數裝置產生新的過程黑客和農奴的最大長度,最後200是巡航的最大長度。

輸出應該在文件

+2

這是太多的代碼來通過找出問題的地方可能是。請嘗試發佈[MCVE](http://stackoverflow.com/help/mcve)。 –

+2

請使用一個調試器,這是很多代碼,並且這個站點的用戶不是它的僱員,所以他們可能沒有時間檢查您發佈的所有代碼,這真的很多,發佈了一個[** M ** inimal,** C ** omplete,** V ** erifiable ** E ** xample](http://stackoverflow.com/help/mcve)。 –

+0

重新重複別人的說法 - 使用調試器。但是有一件事從你的代碼中脫穎而出 - 你正在使用很多同時的信號量。這通常是一個糟糕的設計的標誌,很可能導致同步錯誤(通常是死鎖)。 – kaylum

回答

0

一個或以上的指針(ANHNS,或in_boat)可能是無效的。這可能意味着shmat()返回了其錯誤指示值(根據手冊頁爲(void *)-1)。您的代碼應檢查此錯誤指示值,然後查看errno以查明爲什麼shmat()失敗。