Новичок
Джуниор
Регистрация: 08.06.2013
Сообщений: 1
|
Что делает строка
Имеется код программы, записывающий битовую карту.
Не знаю, что выполняет строка из кода, а необходимо ее объяснить преподу. Строка *pr|=01<<(bit_r); находится на 68 строке.
Помогите, пожалуйста)
Код:
static int b=104857600; /* Размер /dev/sda1 */
struct timeval T;
FILE *log_out,*log_out2;
time_t t_start, t_finish;
static int from_root[2];
static int to_root[2];
int check(void *str,int n,int coun)
{int i,l,ostat,size;
long double *p;
p=(long double *) str;
if(((size=sizeof(long double)) ==64)) l=n/8;
//else if (n%i) {return -1; }
else {l=n/size;
ostat=n%size;}
for (i=0; i<l; i++)
{
/*fprintf(log_out2,"\n%d %f \n",coun,p[i]);*/
if (*p++ !=0) {/* fprintf(log_out2,"Exit because %f ",p[i]); */ return 1;}
}
if (ostat!=0) {char * sp;
int smeshenie=size*l;
sp=(char *) str;
sp=sp+smeshenie;
for (i=smeshenie;i<n;i++)
if (*sp++ !='\0') {return 1;}
}
return 0;
}
void process(int rank, int p)
{ int fd;
FILE *out;
int BLOCKSIZE=512;
fd = open ("/dev/sda1", O_RDONLY);
char s[10]="";
sprintf(s,"./a%d",rank+1);
out = fopen (s, "wb");
char byte;
int len = b/p;
int ost= b%p;
int local_a = rank*len;
int local_b = local_a + len;
if (ost!=0) {local_b=local_b+ost;}
int i=0,j;
if(lseek(fd, local_a,0)==-1L)
printf("Seek Error\n");
int ostatok=(local_b-local_a)%(BLOCKSIZE);
int num=(local_b-local_a)/(BLOCKSIZE);
char *bmap,*pr;
char bit;
if (ostatok==0) {bmap=calloc(num/8,1);}
else {bmap=calloc(num/8+1,1);}
char ch[BLOCKSIZE];
for (i=0;i<BLOCKSIZE;i++) ch[i]='\0';
pr=bmap;
int bit_r;
for (i=0;i<num;i++)
{ bit=i%8;
bit_r=7-i%8;
if (read (fd, &ch, BLOCKSIZE)==-1) {printf("Read error\n");exit(1);}
if(check(ch,BLOCKSIZE,i)==1)
*pr|=01<<(bit_r);
if (bit==7) pr++;
for (j=0;j<BLOCKSIZE;j++) ch[j]='\0';
}
for (i=0;i<num/8;i++) {fprintf(out,"%c",bmap[i]);}
if(ostatok!=0)
{ char symv[ostatok];
if (read (fd, &symv, ostatok)==-1) {printf("Read error\n");exit(1);}
if(check(symv,ostatok,num)==1)
*pr|=01<<(bit_r);
fprintf(out,"%c",bmap[num+1]);
}
if (read(from_root[0], &byte, 1) != 1)
{
printf("ERROR: in read (process) in %d\n",getpid());
exit(1);
}
if (write(to_root[1], &rank, 1)!=1)
{
printf("ERROR: in write (process) in %d\n",getpid());
exit(1);
}
close (fd);
fclose (out);
}
int main (int argc, char ** argv)
{
/*log_out = fopen ("./bitmap_log.txt", "wb");
log_out2 = fopen ("./bitmap_log2.txt", "wb");*/
pid_t pid; int p; int i; int byte;
char byte2;
printf("Size of long double=%d\n",sizeof(long double));
printf("Enter number of PROCESSES\n");
scanf("%d", &p);
if (pipe(from_root)==-1)
{
printf("ERROR: in pipe(from_root) (main)\n");
exit(1);
}
if (pipe(to_root)==-1)
{ //p - число процессов
printf("ERROR: in pipe(to_root) (main)\n");
exit(1);
}
gettimeofday(&T, NULL);
t_start=T.tv_sec*1000000+T.tv_usec;
for (i = 0; i < p; i++)
{ pid = fork();
if (pid==-1)
{
printf("ERROR: pid==-1 (main)\n");
exit(1);
}
else if (pid == 0)
{
// body for child
close(from_root[1]);
close(to_root[0]);
process(i, p);
close(from_root[0]);
close(to_root[1]);
return 0;
}
}
close(from_root[0]);
close(to_root[1]);
for (i = 0; i < p; i++)
{
byte = i;
if (write(from_root[1], &byte, 1)!=1)
{
printf("ERROR: in write (main)\n");
exit(1);
}
if (read(to_root[0], &byte2, 1)!=1)
{
printf("ERROR: in read (main)\n");
exit(1);
}
printf("Process №%d is finished\n",byte2);
}
gettimeofday(&T, NULL);
t_finish=T.tv_sec*1000000+T.tv_usec;
/*fclose (log_out);
fclose (log_out2);*/
printf("Calculated by %d microseconds\n",t_finish-t_start);
char command[100]="cat";
for (i=0;i<p;i++)
sprintf(command+3*(i+1)," a%d",i+1);
sprintf(command+3*(p+1),">bitmap");
system(command);
return 0;
}
Последний раз редактировалось Stilet; 30.05.2014 в 10:02.
|