# 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的信息。
答案 0 :(得分:2)
对于长度为argc-2
的数组,只有0
到argc - 3
的索引才有效。所以这个
for (i=1;i<=(argc-2);i++)
错误,因为您正在访问array[argc - 2]
。它应该是:
for (i = 0; i < argc - 2; i++)
请注意,可能存在导致分段错误的其他错误,因为您没有提供调用程序的方式。
最好是防御处理命令行参数。 (即检查argc
等的有效性。
答案 1 :(得分:0)
在传递命令行参数之前,最好先检查argc
值。
if(argc != /* num of arguments */)
return;
for (i=1;i<=(argc-2);i++)
这是错误的。
必须是
for (i=0;i<argc-2;i++)