-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
是巡航的最大長度。
輸出應該在文件
這是太多的代碼來通過找出問題的地方可能是。請嘗試發佈[MCVE](http://stackoverflow.com/help/mcve)。 –
請使用一個調試器,這是很多代碼,並且這個站點的用戶不是它的僱員,所以他們可能沒有時間檢查您發佈的所有代碼,這真的很多,發佈了一個[** M ** inimal,** C ** omplete,** V ** erifiable ** E ** xample](http://stackoverflow.com/help/mcve)。 –
重新重複別人的說法 - 使用調試器。但是有一件事從你的代碼中脫穎而出 - 你正在使用很多同時的信號量。這通常是一個糟糕的設計的標誌,很可能導致同步錯誤(通常是死鎖)。 – kaylum