Buenas, por favor alguien me puede ayudar a saber detalladamente qué es lo que hace este comando que paso a continuación, es que no lo se, me hago mucho lío. Se los agradecería
el archivo llamado fichero contiene lo que aparece a continuación ($ cat fichero): 230221-g03-entrada 230119-g03-entrada 230109-g02-salida 221115-g01-entrada <C-D>
la salida de este conjunto de comandos registrada en el fichero 'nuevoFichero' es: entrada entrada
Hola, necesito ayuda para resolver un problema de mi código. No sé donde está el fallo ya que a la hora de ejecutar (./padre /home/usuario/*) me devuelve solamente barras, cuando debe devolverme los archivos y directorios que tengo en la ruta. Por ejemplo; en mi ruta /home/usuario/* tengo 17 archivos, cuando ejecuto mi código me devuelve 17 barras (/////////////////) y lo que necesito que me devuelva es el nombre de cada archivo o directorio de esa ruta. Por favor si alguien me puede ayudar, le estaría sumamente agradecida!!!.
A continuacion paso el código del proceso padre y del proceso hijo (ambos códigos son necesarios), el modo de ejecucion debe ser de la siguiente manera: gcc hijo.c -o hijo gcc padre.c -o padre ./padre /home/usuario/*
CODIGO DE PADRE
Código:
/*fd[0] = se encarga de la lectura fd[1] = se encarga de la escritura fd[2] = hace ambas cosas, lectura/escritura*/
#define NUM_HIJOS 10//El numero de hijos debe ser tantos como numero de parametros haya #define NOMBREHIJO "./hijo" #define MAXBUFFER 256 //Tamaño del buffer lectura/escritura
void FinalizarProcesos();
void Manejador(int num);
pid_t pids[NUM_HIJOS]; int longitud_pid=0;//logitud del pid
int main(int argc, char *argv[]){ int fd[2];//Descriptores de la tuberia de comunicacion int i, j; //Para los bucles int pid; //PID de un proceso hijo
int status; //terminacion proceso hijo char buffer[MAXBUFFER];//buffer de lectura/escritura int num_caracteres;
/*Tratamiento de la linea de ordenes*/ if(argc < 2){// < 2 fprintf(stderr, "Error en el numero de argumentos\n"); exit(EXIT_FAILURE); }
/*Tratamiento de la señal*/ if(signal(SIGINT, Manejador)== SIG_ERR){ fprintf(stderr, "Error en la manipulacion de la señal\n"); exit(EXIT_FAILURE); }
/*Creacion de la tubería de comunicacion*/ if(pipe(fd) != 0){ fprintf(stderr, "Error en la creacion de la tuberia\n"); return EXIT_FAILURE; }
//CREACION DE LOS PROCESOS HIJOS for(i=1; i<argc; i++){//NUM_HIJOS switch(pids[i-1]=fork()){ //Se guarda el pid en la tabla de procesos y con pids[i-1]se salta el ./padre case -1: fprintf(stderr, "Error en la creacion del proceso hijo\n"); FinalizarProcesos(); break; case 0: //Ejecucuion por el proceso hijo
/*Redireccion de la entrada estandar al archivo*/ if ((fd[0] = open(argv[1], O_RDONLY)) == -1){ fprintf(stderr, "Error en la apertura del archivo de datos\n"); return EXIT_FAILURE; } close(1); if(dup(fd[1]) != 1){// Asignacion de salida estandar fprintf(stderr, "Error en la duplicacion del descriptor\n"); return EXIT_FAILURE; } if(execl(NOMBREHIJO, NOMBREHIJO, argv[i], NULL) == -1){ //argv[1] fprintf(stderr, "Error en la ejecucion del proceso hijo\n"); perror("execl"); exit(EXIT_FAILURE); } break; default: /*Ejecucion por el proceso padre*/ //close(fd[1]);// debe de ir fuera del for break; } longitud_pid++; //Para tener un control de cuantas cosas hay dentro del pids, por ejemplo hola (longitud=1) mundo (longitud=2) } close(fd[1]);
/*Espera a la finalizacion de los procesos hijos*/ for(i=1; i<NUM_HIJOS; i++){ pid=wait(NULL); //leer un caracter de entrada de la tuberia fd[0] (READ) if ((num_caracteres = read(fd[0], buffer, MAXBUFFER)) > 0){ printf("%.*s", num_caracteres, buffer);//leerá la tuberia y la escribirá en la salida estandar } } printf("[Proceso padre] finaliza\n"); return EXIT_SUCCESS; }
/*FinalizarProcesos: Termina todos los procesos hijos vivos*/ void FinalizarProcesos(void){ int i; for(i=0; i<longitud_pid; i++){ //Logitud_pid es porque los pids leidos van a tener valor if(kill(pids[i], SIGTERM) == -1){ fprintf(stderr, "Error al enviar una señal\n"); exit(EXIT_FAILURE); }
Hola, buenas. He realizado el siguiente código en bash, pero no sé muy bien como puedo hacer lo siguiente: - No sé hacer, que el tamaño devuelto en la ejecución se exprese en bloques de 1024bytes=1KB (Funcion computingSize())
Código:
#!/bin/bash shopt -s dotglob #recuperar ocultos
##################################muestra error y fuerza salida##################################### function mostrarError () { echo "ERROR. Modo de empleo: midu [opciones] [camino1 camino2 caminos3 ...]" exit 1 }
########################################Funcion recursiva########################################### tam_parcial=0 #variable global
function computingSize(){ #Guardamos las opciones en variables locales local opcion_d local opcion_s local opcion_exlude local ruta=$4
#si el camino es un archivo regular la unica opcion a tener en cuenta es --exclude if [ -f $ruta ]; then #se calcula el tamano (aux). Vale tambien con wc -c (tamano en bytes es valido) #stat con opciones adecuadas o en KB con ls -s tam_parcial=$aux fi
#si el camino es un directorio if [ -d $ruta ]; then local nodo #lista todo lo que tiene la ruta archivos y directorios "ls" y los va ha recorrer uno a uno por nodo for nodo in $ruta/*; do #si es directorio if [[ -d $nodo ]] ; then
#Guardar el valor de tam_parcial en variable local (e.j: temp) temp=$tam_parcial #resetear antes de la llamada a funcion recursiva tam_parcial=0
#se recupera/restaura el valor anterior de tam_parcial y se acumula con lo obtenido #en la llamada recursiva tam_parcial <- $(expr $tam_parcial + $temp)
#si es archivo regular elif [[ -f $nodo ]]; then #Calculando con wc -c tam_archivo= wc -c "$nodo"
############################Comprobacion de errores######################################### OPCION="" CONTADOR=1 #Empezamos en el argumento 1 OPCION_D=99999; OPCION_S=99999; OPCION_EXCLU=99999; for i in $@ ; do case $i in "-s" | "-d" | "--exclude") #Error si ya se ha recogido uno o mas caminos if [ $RUTAS ] ; then mostrarError fi case $i in "-d" | "--exclude") #Error si -d o --exclude es el utimo param (y no tienen ningun valor detras) if [ $CONTADOR -eq $# ]; then mostrarError fi OPCION=$i ;; "-s") #La opcion -s no tiene ningun param detras (Ruta) OPCION_S=1 ;; esac ;; *) ##Recuperamos los parametros para la opcion y/o la ruta## case $OPCION in #Deberia recoger ahora el param de -d "-d") NIVELES=`expr $i / 1` #Paso a entero #Si no hay niveles if [ ! $NIVELES ] ; then mostrarError fi #si los niveles son negativos if [ $NIVELES -lt 0 ] ; then mostrarError fi OPCION_D=$NIVELES ;;
#Param de --exclude "--exclude") OPCION_EXCLU=$i ;;
"") #Para recoger el camino. $i representa un camino dse anade al array vector RUTAS+=("$i") ;; esac #resetea al coger la opcion adecuada OPCION="" ;; esac CONTADOR=$(expr $CONTADOR + 1) done
##################################################################### # Tratar cuando no se especifica camino if [ ! $RUTAS ] ; then computingSize $OPCION_D $OPCION_S $OPCION_EXCLU "." else for i in "${RUTAS[@]}"; do # Llamar a computingSize computingSize $OPCION_D $OPCION_S $OPCION_EXCLU $i done fi
Buenas, necesito ayuda URGENTE en un código de bash que he realizado, mi duda es en la función computingSize() del código que paso a continuación ya que la función debe de calcular el tamaño en bytes o KBytes Recorriendo de forma recursiva los ficheros regulares y subdirectorios, evaluando las opciones especificadas, haciendo la función del comando du (ejemplo: du -d 0 --exclude=PATRON /RUTA).
CÓDIGO:
Código:
#!/bin/bash shopt -s dotglob #recuperar ocultos
##################################muestra error y fuerza salida##################################### function mostrarError () { echo "ERROR. Modo de empleo: midu [opciones] [camino1 camino2 caminos3 ...]" exit 1 }
########################################Funcion recursiva########################################### tam_parcial=0 #variable global
function computingSize(){ #Guardamos las opciones en variables locales local opcion_d local opcion_s local opcion_exlude local ruta=$4
#si el camino es un archivo regular la unica opcion a tener en cuenta es --exclude if [ -f $ruta ]; then #se calcula el tamano (aux). Vale tambien con wc -c (tamano en bytes es valido) #stat con opciones adecuadas o en KB con ls -s tam_parcial=$aux fi
#si el camino es un directorio if [-d $ruta]; then local nodo #lista todo lo que tiene la ruta archivos y directorios "ls" y los va ha recorrer uno a uno por nodo for nodo in $ruta/*; do #si es directorio if [-d $nodo]; then
#Guardar el valor de tam_parcial en variable local (e.j: temp) temp=$tam_parcial #resetear antes de la llamada a funcion recursiva tam_parcial=0
#se recupera/restaura el valor anterior de tam_parcial y se acumula con lo obtenido #en la llamada recursiva tam_parcial <- $(expr $tam_parcial + $temp)
#si es archivo regular elif [-f $nodo]; then #Calculando con wc -c tam_archivo
############################Comprobacion de errores######################################### OPCION="" CONTADOR=1 #Empezamos en el argumento 1 OPCION_D=99999; OPCION_S=99999; OPCION_EXCLU=99999; for i in $@ ; do case $i in "-s" | "-d" | "--exclude") #Error si ya se ha recogido uno o mas caminos if [ $RUTAS ] ; then mostrarError fi case $i in "-d" | "--exclude") #Error si -d o --exclude es el utimo param (y no tienen ningun valor detras) if[$CONTADOR -eq $#]; then mostrarError fi OPCION=$i ;; "-s") #La opcion -s no tiene ningun param detras (Ruta) OPCION_S=1 ;; esac ;; *) ##Recuperamos los parametros para la opcion y/o la ruta## case $OPCION in #Deberia recoger ahora el param de -d "-d") NIVELES=`expr $i / 1` #Paso a entero #Si no hay niveles if [ ! $NIVELES ] ; then mostrarError fi #si los niveles son negativos if [ $NIVELES -lt 0 ] ; then mostrarError fi OPCION_D=$NIVELES ;;
#Param de --exclude "--exclude") OPCION_EXCLU=$i ;;
"") #Para recoger el camino. $i representa un camino dse anade al array vector RUTAS+=("$i") ;; esac #resetea al coger la opcion adecuada OPCION="" ;; esac CONTADOR=$(expr $CONTADOR + 1) done
##################################################################### # Tratar cuando no se especifica camino if [ ! $RUTAS ] ; then computingSize $OPCION_D $OPCION_S $OPCION_EXCLU "." else for i in "${RUTAS[@]}"; do # Llamar a computingSize computingSize $OPCION_D $OPCION_S $OPCION_EXCLU $i done fi
Buenas tardes!, tengo ciertas dudas a la hora de generar el código en java de unas clases UML y es que no sé muy bien los métodos que tienen que llevar tampoco sé si las relaciones entre clases hay que ponerlas y cómo se pueden poner.
Si me pueden ayudar a saber como puedo generar los métodos de la clase entities->Profesor y entities->CursoPropio
Agradecería mucho si me ayudan a resolver estas lagunas que tengo. Soy nueva programando y no se muy bien como se hace.
Dejo un enlace a un video donde aparecen las clases UML que tengo que generar su código y sobre las que tengo duda:
El código que he hecho de la clase CursoPropio es el siguiente, pero no sé si me faltan o no métodos:
public class CursoPropio { private String _id; private String _nombre; private int _eCTS; private Date _fechaInicio; private Date _fechaFin; private double _tasaMatricula; private int _edicion; public Vector<Matricula> _matriculas = new Vector<Matricula>(); public Centro _centro; public ProfesorUCLM _director; public ProfesorUCLM _secretario; public Vector<Materia> _materias = new Vector<Materia>(); public EstadoCurso _estado; public TipoCurso _tipo; public CursoPropioDAO _cursoPropioDao; }
Buenas, estoy haciendo un programa en java Cliente y Servidor con sockets UDP. El cliente y el servidor se deben de enviar mutuamente ( intercambiando mensajes ) la hora actual en el momento de ejecucion, y tambien deben de imprimir el número segundos transcurridos en el intercambio de mensajes(ESTO ULTIMO NO TENGO NI IDEA DE COMO LO PUEDO HACER). He hecho el codigo del intercambio de hora pero me da error. Si alguien porfavor me pudiese ayudar a saber donde esta el fallo y tambien si me puede ayudar a saber como puedo hallar los segundos transcurridos, estaría muy agradecida.
try { DatagramSocket socketUDP = new DatagramSocket(); byte[] mensaje = args[0].getBytes(); InetAddress hostServidor = InetAddress.getByName(args[1]); int puertoServidor = 5000;
//Construimos un datagrama para enviar el mensaje al Servidor DatagramPacket peticion = new DatagramPacket(mensaje, args[0].length(), hostServidor, puertoServidor); //Enviamos el datagrama SimpleDateFormat dateFormat=new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss]");// Establecer el formato de fecha System.out.println("Fecha y hora enviadas al servidor: "+dateFormat.format(new Date()));
socketUDP.send(peticion);
//Construimos el datagrama que contendra la respuesta byte[] buffer = new byte[1000]; DatagramPacket respuesta = new DatagramPacket(buffer, buffer.length);
socketUDP.receive(respuesta);
//Enviamos la respuesta del servidor a la salida estandar System.out.println("Respuesta: "+ new String(respuesta.getData()));
try { @SuppressWarnings("resource") DatagramSocket socketUDP = new DatagramSocket(5000); byte[] buffer = new byte[1000];
while(true) { //Construimos el DatagramPacket para recibir peticiones DatagramPacket peticion = new DatagramPacket(buffer, buffer.length);
//Leemos una peticion del DatagramSocket socketUDP.receive(peticion);
System.out.println("Datagrama recibido del host: "+ peticion.getAddress()); System.out.println(" desde el puerto remoto: "+ peticion.getPort());
//Construimos el DatagramPacket para enviar la respuesta DatagramPacket respuesta = new DatagramPacket(peticion.getData(), peticion.getLength(), peticion.getAddress(), peticion.getPort());
SimpleDateFormat dateFormat=new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss]");// Establecer el formato de fecha System.out.println("Fecha y hora enviadas al cliente: "+dateFormat.format(new Date()));
//Enviamos la respuesta, que es un eco socketUDP.send(respuesta); }
Buenas, tengo un problema y es que no sé como puedo poner el tiempo transcurrrido (tanto en Cliente como en Servidor) antes de que se imprima la fecha-hora en formato legible por humanos. Apunte: entre cliente y Servidor se intercambian la fecha actual en su tiempo de ejecución. Agradeceria muchiisimo si alguien me pudiese ayudar A continuacion el codigo de Cliente y Servidor:
Cliente:
Código:
public class ClienteHora {
public static void main(String[] args) throws IOException {
final String HOST="127.0.0.1"; //INDICO A QUIEN ME VOY A CONECTAR final int PUERTO=5000;//Pongo el puerto que puse en el servidor //Clases necesarias DataInputStream in; DataOutputStream out;
//Cuando el cliente conecta exitosamente al servidor: //Cliente TCP conectado a <nombre host> en el puerto <número puerto>
Socket sc = new Socket(HOST, PUERTO); //A esta clase socket le pasamos el HOST y el PUERTO System.out.println("Cliente TCP conectado a: "+HOST+" en el puerto: "+PUERTO);
//Creamos puentes de comunicacion in = new DataInputStream(sc.getInputStream()); //inputStream(LEE): cliente -> servidor out = new DataOutputStream(sc.getOutputStream());
String mensaje = in.readUTF(); //leemos el mensaje System.out.println(mensaje);
//Esto me servirá para contar los caracteres, los espacios String mayus=""; String minus=""; String numeros=""; String letras="";
int n_mayus=0; int n_minus=0; int n_numeros=0; int n_letras=0; int n_espacios=0;
System.out.println("Mensaje recibido: "+mensaje); System.out.println("Se han recibido: "+"\n -El número de caracteres: "+n_letras+"\n -Mayusculas: "+n_mayus+"\n -Minusculas: "+n_minus+ "\n -El número de espacios: "+n_espacios+"\n -La cantidad de datos numéricos: "+n_numeros);
Date fechaHoraActuales = new Date(); out.writeUTF("fecha y hora enviadas al Servidor: "+ fechaHoraActuales); /* long startTime = System.currentTimeMillis(); // Run some code; long stopTime = System.currentTimeMillis(); System.out.println("El tiempo transcurrido fue: " + (stopTime - startTime) + " miliseconds."); */
public static void main(String[] args) throws IOException { ServerSocket servidor = null; Socket sc = null; final int PUERTO = 5000; final String HOST = "127.0.0.1";
DataInputStream in; DataOutputStream out;
servidor = new ServerSocket(PUERTO); System.out.println("El servidor de DayTime ha arrancado: ServerSocket [direccion="+HOST+", localport="+PUERTO+"]" ); //El servidor siempre estará atento a escuchas peticiones de los clientes
Buenas tengo una duda y es que en un ejercicio a realizar con Sockets se me pide que el Servidor le envíe al Cliente la fecha y la hora actuales, lo he hecho pero me da fallos a la hora de ejecutar el servidor y no se porque, a continuacion paso el codigo del servidor y del cliente(es el que recibe la fecha y hora del servidor y debe de mostrar la siguiente informacion: Se han recibido <número de caracteres, incluidos espacios y saltos de línea> bytes <Fecha y hora recibidas tal cual se recibieron del servidor de hora>. Yo para ello he hecho un bucle for que analice el mensaje recibido del servidor para poder contar el numero de caracteres, los espacios y mostrarlos por pantalla), es la primera vez que trato con sockets y muchas veces no se si lo estoy haciendo bien o no .
@SuppressWarnings({ "resource", "unused" }) public static void main(String[] args) throws IOException { ServerSocket servidor = null; Socket sc = null; final int PUERTO = 5000; final String HOST="127.0.0.1"; //INDICO A QUIEN ME VOY A CONECTAR
DataInputStream in; DataOutputStream out; servidor = new ServerSocket(PUERTO); //- Cuando se inicia el Socket Servidor: //El servidor de DayTime ha arrancado: ServerSocket[ addr=<dirección>,localport=<número puerto local>] System.out.println("El servidor de DayTime ha arrancado" ); //El servidor siempre estará atento a escuchas peticiones de los clientes while(true) { sc = servidor.accept(); //Cliente conectado desde <host> al puerto <número puerto local> desde el puerto <número puerto //cliente> System.out.println("Cliente conectado");//Aviso cliente conectado
//Creamos puentes de comunicacion in = new DataInputStream(sc.getInputStream()); //inputStream(LEE): cliente -> servidor out= new DataOutputStream(sc.getOutputStream()); //outputStream(ESCRIBE): servidor -> cliente
//Esto me servirá para enviar la fecha y la hora Date fechaHoraActuales = new Date(); out.writeUTF("Fecha y Hora enviadas: "+ fechaHoraActuales); //Yo le escribo un mensaje
sc.close();//Cerramos el cliente. System.out.println("Cliente desconectado");//Aviso de que esta desconectado
public static void main(String[] args) throws IOException { final String HOST="127.0.0.1"; //INDICO A QUIEN ME VOY A CONECTAR final int PUERTO=5000;//Pongo el puerto que puse en el servidor //Clases necesarias DataInputStream in;
//Cuando el cliente conecta exitosamente al servidor: //Cliente TCP conectado a <nombre host> en el puerto <número puerto>
Socket sc = new Socket(HOST, PUERTO); //A esta clase socket le pasamos el HOST y el PUERTO System.out.println("Cliente TCP conectado a: "+HOST+" en el puerto: "+PUERTO);
//Creamos puentes de comunicacion in = new DataInputStream(sc.getInputStream()); //inputStream(LEE): cliente -> servidor
String mensaje = in.readUTF(); //leemos el mensaje System.out.println(mensaje);
//Esto me servirá para contar los caracteres, los espacios String mayus=""; String minus=""; String numeros=""; String letras="";
int n_mayus=0; int n_minus=0; int n_numeros=0; int n_letras=0; int n_espacios=0;
System.out.println("Mensaje recibido: "+mensaje); System.out.println("Mayusculas("+n_mayus+"): "+mayus); System.out.println("Minusculas("+n_minus+"): "+minus); System.out.println("Numeros("+n_numeros+"): "+numeros); System.out.println("Letras("+n_letras+"): "+letras); System.out.println("Espacios: "+n_espacios); //- Una vez ha recibido la información del servidor: //Se han recibido <número de caracteres, incluidos espacios y saltos de línea> bytes //<Fecha y hora recibidas tal cual se recibieron del servidor de hora>
Buenas, he hecho el codigo en java pero no se como modificar el codigo para que haga las inversiones de 1. Se trata de un codigo divide y venceras donde se me proporciona un .txt o un .dat con un conjunto de numeros de entre los cuales se proporciona el numero uno y aparece en la lista de numeros una sola vez. Y tengo que hallar las inversiones de 1, sé que el resultado correcto que me debe de dar la modificacion es de: 545 A continuacion el fichero de inversiones de uno y el codigo
/** * The Class Inversiones. * Clase que calcula el número de inversiones que hay en un array para ordenarlo * * @author Pitagoras * @version 20.03.2022 */ public class Inversiones {
/** * The main method. * * @param args the arguments * @throws IOException Signals that an I/O exception has occurred. */ public static void main(String[] args) throws IOException { Scanner leer = new Scanner(new File("C:\\Ruta\\InversionsTest.dat")); int nCases = leer.nextInt();
System.out.println("El número de inversiones que tiene el array dado es: " +ordenar(a, 0, a.length-1)); } /** * Merge. Método valido para ordenar el array. * * @param a2 array que queremos ordenar * @param a numero de la izquierda * @param middle la mitad entre el límite inferior y superior * @param b numero de la derecha * @return el número de inversiones que hay durante el recorrido del método */ private static int merge (double[] a2, int a, int middle, int b) { int cont=0; int i=0, j=0, k=a;
double[] left = Arrays.copyOfRange(a2, a, middle+1); double [] right = Arrays.copyOfRange(a2, middle+1, b+1);
/** * Método para ordenar el array, recursivo. Parecido a MergeSort. * * @param a2 array a ordenar * @param min, limite inferior del array que queremos ordenar - referido a posiciones dentro del array * @param max, limite superior del array que queremos ordenar - referido a posiciones dentro del array * @return numero de inversiones necesarias para ordenar el array */ private static int ordenar(double[] a2, int min, int max) { int cont=0; int middle = (min+max)/2; if(min<max) { cont = ordenar (a2, min, middle); cont = cont + ordenar (a2, middle + 1, max); cont = cont + merge (a2, min, middle, max); } return cont; }
}
ES LO UNICO QUE ME FALTA PARA TERMINARLO, PORFAVOR SI ALGUIEN ME PUDIESE AYUDAR