#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <cstdlib>
#include <string.h>
#include <sys/shm.h>
#include <unistd.h>
using namespace std;
int **matriz_in;
double **matriz_out;
bool **matriz_verif;
int limites[4][9];
bool *ya;
key_t ClaveOut;
int idMemoriaOut;
key_t ClaveIn;
int idMemoriaIn;
key_t ClaveVerif;
int idMemoriaVerif;
key_t ClaveYa;
int idMemoriaYa;
void inicializar_verif(){
for(int i=0; i<340; i++){
for(int j=0; j<480; j++){
matriz_verif[i][j]= false;
}
}
}
void cargar_datos(){
ifstream entrada;
entrada.open("matriz.txt");
if (!entrada){
cerr<<"Error al abrir el archivo";
}
char buffer[1500];
for(int i=0;i<340;i++){
entrada.getline(buffer, 1500);
char *num= strtok(buffer, " ");
matriz_in[i][0]= atoi(num);
for(int j=1; j<480; j++){
num = strtok(NULL, " ");
matriz_in[i][j]= atoi(num);
}
}
entrada.close();
}
void aplicar_filtro(int ini_x, int fin_x, int ini_y, int fin_y ){
int contador_i =1 ;
int contador_j =1 ;
for(int i=ini_x;i<fin_x;i++){
for(int j=ini_y; j<fin_y; j++){
if(matriz_verif[i][j]==false){
if(contador_i==2 && contador_j==2){
matriz_out[i][j]= matriz_in[i][j] * 0;
}else{
matriz_out[i][j]= matriz_in[i][j] * 0.125;
}
matriz_verif[i][j]=true;
}
contador_j++;
if(contador_j==4) contador_j=1;
}
contador_i++;
if(contador_i==4) contador_i=1;
}
}
void guardar_datos(){
ofstream salida("matriz_transformada.txt", ios::app);
for(int i=170; i<340; i++){
for(int j=0; j<480; j++){
salida<<matriz_out[i][j]<<" ";
}
salida<<"n";
}
salida.close();
}
void asignar_limites(){
limites[0][0]=170;
limites[0][1]=228;
limites[0][2]=0;
limites[0][3]=162;
limites[1][0]=170;
limites[1][1]=228;
limites[1][2]=160;
limites[1][3]=322;
limites[2][0]=170;
limites[2][1]=228;
limites[2][2]=320;
limites[2][3]=480;
limites[3][0]=226;
limites[3][1]=284;
limites[3][2]=0;
limites[3][3]=162;
limites[4][0]=226;
limites[4][1]=284;
limites[4][2]=160;
limites[4][3]=322;
limites[5][0]=226;
limites[5][1]=284;
limites[5][2]=320;
limites[5][3]=480;
limites[6][0]=282;
limites[6][1]=340;
limites[6][2]=0;
limites[6][3]=162;
limites[7][0]=282;
limites[7][1]=340;
limites[7][2]=160;
limites[7][3]=322;
limites[8][0]=282;
limites[8][1]=340;
limites[8][2]=320;
limites[8][3]=480;
}
int main()
{
ClaveOut = ftok("/bin/more",59);
if(ClaveOut==-1){
cout<<"No consigo clave para memoria compartida OUT"<<endl;
exit(0);
}
ClaveIn = ftok("/bin/lsmod",69);
if(ClaveIn==-1){
cout<<"No consigo clave para memoria compartida IN"<<endl;
exit(0);
}
ClaveVerif = ftok("/bin/ls",3);
if(ClaveVerif==-1){
cout<<"No consigo clave para memoria compartida VERIF"<<endl;
exit(0);
}
idMemoriaOut=shmget (ClaveOut, sizeof(double)*340*480, 0777 | IPC_CREAT);
if(idMemoriaOut==-1){
cout<<"No consigo clave para memoria compartida OUT1"<<endl;
exit(0);
}
idMemoriaIn=shmget (ClaveIn, sizeof(int)*340*480, 0777 | IPC_CREAT);
if(idMemoriaIn==-1){
cout<<"No consigo clave para memoria compartida IN1"<<endl;
exit(0);
}
idMemoriaVerif=shmget (ClaveVerif, sizeof(bool)*340*480, 0777 | IPC_CREAT);
if(idMemoriaVerif==-1){
cout<<"No consigo clave para memoria compartida VERIF1"<<endl;
exit(0);
}
matriz_in = (int**)shmat (idMemoriaIn, (char*)0,0);
if(matriz_in ==NULL ){
cout<<"No se consiguio memoria compartida"<<endl;
exit(0);
}
matriz_out = (double**)shmat (idMemoriaOut, (char*)0,0);
if(matriz_out ==NULL ){
cout<<"No se consiguio memoria compartida"<<endl;
exit(0);
}
matriz_verif = (bool**)shmat (idMemoriaVerif, (char*)0,0);
if(matriz_verif ==NULL ){
cout<<"No se consiguio memoria compartida"<<endl;
exit(0);
}
matriz_in = new int * [340];
for (int i=0; i<340; i++)
matriz_in[i] = new int [480];
matriz_out = new double * [340];
for (int i=0; i<340; i++)
matriz_out[i] = new double [480];
matriz_verif = new bool* [340];
for (int i=0; i<340; i++)
matriz_verif[i] = new bool [480];
time_t start,end;
double dif;
pid_t pid[9];
time (&start);
asignar_limites();
inicializar_verif();
cargar_datos();
for(int i=0;i<9; i++){
pid[i] =fork();
if(pid[i]==0){
aplicar_filtro(limites[i][0], limites[i][1], limites[i][2], limites[i][3] );
//exit(2);
cout<<pid[i];
guardar_datos();
}
else if(pid<0){
cerr << "Failed to fork" << endl;
exit(1);
}
else {
cout<<pid[i];
time (&end);
dif = difftime (end,start);
cout<<"El tiempo es "<<dif<<" segundos"<<endl;
shmdt ((double **)matriz_out);
shmctl (idMemoriaOut, IPC_RMID, (struct shmid_ds *)NULL);
shmdt ((int **)matriz_in);
shmctl (idMemoriaIn, IPC_RMID, (struct shmid_ds *)NULL);
shmdt ((bool **)matriz_verif);
shmctl (idMemoriaIn, IPC_RMID, (struct shmid_ds *)NULL);
}
return 0;
}
}