c - segmentation fault 11 i have no idea why -


edit: know error in main function if delete this:

*a=0; *nh=0; *ns=0; *in_boat=0; 

and run there no segfault, why happening?

following code returns segmentation fault 11..i don't know why:

#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 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 shared memory segment semaphores         int id_i_hacker, id_i_serf, id_nh, id_ns, id_in_boat, id_a;//ids shared memory segment counter variables     int i,x,y;//temp variables      srand(time(null));//seeding random function      p = atoi(argv[1]);//retrieving values 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 micro seconds, usleep() takes micro seconds argument     s*=1000;     r*=1000;      fp = fopen("rivercrossing.out","w");//opening file      if(fp==null)     {         fprintf(stderr,"unable 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);       = (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; } 

this implements synchronization problem known rivercrossing.

i compile gcc rivercrossing.c -o rc , run like: ./rc 2 2 2 200 first 2 number of persons generated in each category(serf, hacker), second , third 2 means maximal length of generating new process hacker , serf, last 200 maximal length of cruise.

the output should in file

one or more of pointers (a, nh, ns, or in_boat) not valid. may mean shmat() returned error indication value (which according man page (void *)-1). code should check error indication value, , @ errno find out why shmat() failed.


Comments