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 为什么?

4

1 回答 1

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

接着

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

你在数组边界之外写(和孩子读),调用未定义的行为。试图进一步解释结果是没有意义的。

修复之后,您仍然没有得到正确的结果,原因很明显的原因是您尝试传输每个部分的部分和

exit(s1);

标准exit()第 7.22.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的余数之和。

于 2013-05-02T14:44:43.743 回答