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
Post a Comment