2014-11-27 5 views
0
# include <stdio.h> 
# include <stdlib.h> 
# include <stddef.h> 
# include <sys/types.h> 
# include <sys/ipc.h> 
# include <sys/shm.h> 
# include <sys/sem.h> 
# include <unistd.h> 
# include <time.h> 
# include <math.h> 

int main(int argc, const char* argv[]) 
{ 
    int i,j,x,shM, *shmPtr; 
int *array_pid, *apotelesma, loops,y,N; 
int *array1; 
double a,b,temp; 





shM=shmget(3002,sizeof(int),IPC_CREAT|0600); 
shmPtr=(shM,0,0); 


array1=(int*)malloc((argc-2)*sizeof(int)); 

if(array1==NULL) 
printf("error in array1"); 

for (i=0;i<=(argc-2);i++) 
{ 
array1[i]=atoi(argv[i]); 

} 

N=argc; 
loops=atoi(argv[argc-1]); 
array_pid=(int*)malloc(N*sizeof(int)); 

if (array_pid==NULL) 
printf("error in array_pid"); 

apotelesma=(int*)malloc(N*sizeof(int)); 

if (apotelesma==NULL) 
printf("error in apotelesma"); 

j=fork(); 

if (j>0) 
{ 
array_pid[i]=j; 


for (i=0;i<loops;i++) 
{ 

srand(time(NULL)); 

if (i>0) 
apotelesma[i]=*shmPtr; 

y=(rand()%(argc-2)); 

array1[y]=*shmPtr; 
printf("y=%d apotelesma=%d",y,apotelesma[i]); 



} 




*shmPtr=-1; 





for (i=0;i<N;i++) 
wait(); 


shmdt(shmPtr); 
shmctl(shM,0,IPC_RMID); 

exit(0); 
} 

else //child 
{ 
while(1) 
{ 

    x=*shmPtr; 
    if(x<0) 
{ 

exit(0); 
} 
a=rand(); 
b=rand(); 
temp=(pow((a-x/2),2)+pow((b-x/2),2)); 
temp=sqrt(temp); 
if (temp<=x/2) 
     *shmPtr=1; 
    else 
     *shmPtr=0; 


    } 


} 

} 

내가 다시 세분화 오류가 어디 있는지 모르겠지만 전체 코드를 게시 해요. 나는 그것이 문제를 일으키는 공유 메모리일지도 모른다고 생각한다. argv 계산에 대한 정보를 제공해 주셔서 감사합니다.대처 argv []에서 int 배열에 배열

+0

코드가 프로그램 이름 뒤에 명령 행에서 (적어도)이 매개 변수가있을 것입니다 가정합니다. 당신의 코드는 argc의 값을 비교함으로써 – user3629249

답변

2

길이가 argc-2 인 배열의 경우 0에서 argc - 3의 인덱싱 만 유효합니다. 이

for (i=1;i<=(argc-2);i++) 

은 (는) array[argc - 2]에 액세스했기 때문에 잘못되었습니다. 그것은 :

세그먼테이션 오류를 일으키는 다른 오류는 프로그램 호출 방법을 제공하지 않았기 때문에 발생할 수 있습니다.

명령 줄 인수를 처리하는 것이 좋습니다. (즉, argc 등의 유효성을 확인하십시오.)

0

명령 줄 인수를 전달할 때 계속 진행하기 전에 항상 argc 값을 확인하는 것이 좋습니다.

if(argc != /* num of arguments */) 
return; 

for (i=1;i<=(argc-2);i++) 

잘못되었습니다.

그것은이어야한다

for (i=0;i<argc-2;i++)