2013-05-02 1 views
0

두 개의 다른 하위 프로세스를 사용하여 배열의 요소를 추가하는 데 공유 메모리를 사용하고 있지만 출력은 잘못되었습니다. 세그먼트 화 오류가 발생합니다. 배열의 모든 구성원의 합계 : 이것은 나에게 넣어 밖으로을주는배열의 요소를 더하는 합이 잘못된 결과를 낳습니다.

int main() 
{ 
int a[100],i,k,s1=0,s2=0,lim=100; 
int status1,status2; 
pid_t pid1,pid2; 
int perm=S_IRWXU|S_IRWXG|S_IRWXO; 
int fd=shmget(IPC_PRIVATE,1024,IPC_CREAT|perm); 
if(fd<0) 
{ 
    printf("error"); 
    _exit(0); 
} 
int* sum=(int*)shmat(fd,NULL,0); 
if(*sum==-1) 
{ 
    printf("error\n"); 
    _exit(0); 
} 
*sum=0; 

for(i=0;i<lim;i++) 
{ 
a[i]=i; 
    } 


if((pid1=fork())==0) 
{ 
    for(i=1;i<lim;i+=2) 
    { 
    s1 += a[i]; 
    } 
    exit(s1); 
} 
else if((pid2=fork())==0) 
{ 
    for(i=0;i<lim;i+=2) 
    { 
    s2+= a[i]; 
    } 
    exit(s2); 
} 
else 
{ 
    printf("the elements of array are\n"); 
    for(i=0;i<lim;i++) 
    printf("%d\t",a[i]); 

    waitpid(pid1, &status1, 0); 
    *sum = *sum+WEXITSTATUS(status1); 
    waitpid(pid2, &status2, 0); 
    *sum = *sum+ WEXITSTATUS(status2); 

    printf("\nSum of all members of the array: %d\n", *sum); 
} 
return 0; 
} 

342 이유는 무엇입니까?

+1

'if (* sum == 1) '을 체크하는 이유는 무엇입니까? –

+0

미안하지만 -1이 아니어야합니다. –

+0

그렇다면'sum'이 아닌'sum'을 확인해야합니다. –

답변

1
int a[10],i,k,s1=0,s2=0,lim=100; 

다음

for(i=0;i<lim;i++) 
{ 
    a[i]=i; 
} 

당신이 작성하는 (그리고 읽는 어린이) 정의되지 않은 동작을 호출하는 배열 범위 밖에. 결과를 더 설명하려고 노력하는 것은 무의미합니다. 즉 고정 된 후

, 여전히 올바른 결과를 얻을하지 않습니다 이유에 대한 명백한 후보는 섹션 7.22에서 exit()에 대한

exit(s1); 

의 사양에 따라 부분 합계를 전송하려고한다는 것입니다. 4.4 표준의 말 :

마지막으로 제어가 호스트 환경으로 리턴됩니다. status 값이 0 또는 EXIT_SUCCESS이면 구현이 정의한 상태 성공 종료 양식이 리턴됩니다. status의 값이 EXIT_FAILURE이면, 구현 실패로 인해 실패한 상태의 구현 정의 형식이 리턴됩니다. 그렇지 않으면 반환 된 상태는 구현에 따라 정의됩니다.

하나 개의 일반적인 것은 0 ~ 255의 범위에서만 종료 상태가 사용된다는 점이며,

Prelude> sum [1, 3 .. 99] 
2500 
Prelude> 2500 `mod` 256 
196 
Prelude> sum [0, 2 .. 99] 
2450 
Prelude> 2450 `mod` 256 
146 
Prelude> 196 + 146 
342 

당신의 결과는 부분합의 나머지의 합 모듈로 256

입니다
+0

으로 변경 한 후에도 [100] 작동하지 않습니다. –

+0

감사합니다. –

관련 문제