我使用共享内存使用两个不同的子进程添加数组的元素,但输出没有错。而且我遇到了分段错误。
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 为什么呢?
答案 0 :(得分:1)
int a[10],i,k,s1=0,s2=0,lim=100;
然后
for(i=0;i<lim;i++)
{
a[i]=i;
}
您正在数组范围外编写(并在子项中读取),调用未定义的行为。试图进一步解释结果是毫无意义的。
在修复之后,你仍然没有得到正确的结果,显而易见的原因是你尝试传输部分和
exit(s1);
标准第7.22.4.4节中exit()
的规范说:
最后,控制权返回给主机环境。如果status的值为零或
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的部分和的余数之和。