elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 ... 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ... 127
341  Programación / Programación C/C++ / Re: Problemita con FILES en: 6 Octubre 2010, 20:04 pm
Cual es el error?
342  Programación / Programación C/C++ / Re: Problemita con FILES en: 6 Octubre 2010, 19:42 pm
lo que sucede es que estas abriendo el archivo solo para escritura... 'a' sirve para añadir datos al final del archivo simplemente... en este caso necesitas 'a+' que te da permisos de lectura.
343  Programación / Programación C/C++ / Re: [Capitulo II] Procesos en: 6 Octubre 2010, 17:30 pm
para lo que pides esta fwprintf().

Info:
Código:
man 3 fwprintf
344  Programación / Programación C/C++ / Re: [Capitulo II] Procesos en: 6 Octubre 2010, 16:06 pm
:xD sabia que se me habia escapado algo... ya esta editado.
345  Programación / Programación C/C++ / [Capitulo II] Procesos en: 6 Octubre 2010, 08:19 am
Procesos

   Un programa en ejecucion recibe el nombre de proceso. Estos estan gestionados por el sistema operativo. Un proceso esta conformado por las instrucciones que van a ser ejecutadas por el microprocesador, el estado de ejecucion en un momento especifico, la memoria de trabajo para el proceso y otra informacion que requiera el sistema operativo.

   En los sistemas operativos basados en Linux cada proceso es identificado por un unico ID llamado Process ID(pid). Los Process IDs son numeros de 32bits asignados secuencialmente por Linux cada vez que un nuevo proceso es creado. Aparte de todo esto, cada proceso tiene un proceso padre, exceptuando el proceso 'init', cuando nos refiramos desde un proceso hijo hacia un proceso padre nos referiremos con la abreviatura ppid(Parent Process ID).

   Para referirnos al ID de un proceso utilizaremos el tipo 'pid_t' el cual esta definido en el archivo cabecera '<sys/types.h>'. Una pequeña aclaracion, el tipo de dato pid_t es simplemente un tipo 'signed int', utilizar el tipo 'pid_t' o 'signed int' no hara ningun cambio pero para facilidad de lectura de tu codigo por otras personas es preferible utilizar 'pid_t' cuando te refieras a un Process ID.

Obteniendo nuestro Process ID


   En algunos casos necesitaremos obtener nuestro Process ID, para verificarlo en una lista, para pasarlo a otro proceso, etc. Para obtener dicho Process ID se nos ha dotado de dos funciones getpid(),para obtener nuestro propio Process ID, y getppid(),para obtener el Process ID del proceso padre, dichas funciones se encuentran en el archivo cabecera 'unistd.h' el cual es el archivo que nos da acceso a las API del Sistema Operativo POSIX (Portable Operative System Interface for uniX).
   
   Ninguna de las funciones vistas anteriormente reciben un parametro y como valor de retorno devuelven un pid_t, el cual dependera de la funcion que ha sido llamada.

Código:
pid_t getpid (void)
pid_t getppid (void)


   Veamos un pequeño ejemplo del uso de estas funciones:

Código
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4.  
  5. int main()
  6. {
  7. pid_t currentpid, parentpid;
  8. currentpid = getpid();
  9. parentpid = getppid();
  10. printf("El proceso %i es padre del proceso %i \n",parentpid,currentpid);
  11. return 0;
  12. }
  13.  

Como vemos si ejecutamos varias veces el mismo programa en la misma consola, el valor del Process ID del proceso padre no varia debido a que la consola es el proceso padre.

Creando un Proceso.

Existen dos tecnicas comunes para crear un proceso, la primera es utilizando 'system()', es sencilla de utilizar pero esta se debe de utilizar con cierta precaucion debido a que es ineficiente y es considerada como un riesgo de seguridad.La segunda es utilizando fork() o exec(), esta es mas compleja pero nos otorga flexibilidad, velocidad y seguridad.

Utilizando system():


Código:
int system (const char *string)

Hay que tomar en consideracion 2 valores de retorno, devolvera '127' si la ejecucion en la consola falla, en caso de otro error el valor de retorno sera -1. Aparte de estos valores, system() mostrara en pantalla en caso de ser posible el proceso o comando ejecutado.

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. printf("%i \n",system("dir"));
  6. return 0;
  7. }

para mas informacion:
Código:
man 3 system

Utilizando fork() y exec():


Código:
pid_t fork(void)

La funcion fork() crea un proceso hijo identico al proceso padre, la unica diferencia entre ellos es el PID y la direccion de memoria fisica en la RAM. En los actuales Sistemas Operativos las direcciones de las variables en memoria no corresponden a la verdadera memoria fisica en hardware. Las direcciones estan administradas por direcciones virtuales en el Sistema Operativo por esta razon en el proceso padre y el proceso hijo incluso cuando tienen la misma direccion virtual de memoria, la direccion fisica es diferente.

La funcion fork() devuelve en el proceso padre el pid del proceso hijo, mientras que en el proceso hijo devuelve 0.

Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4.  
  5. int main()
  6. {
  7. pid_t proc;
  8. int status,value=0;
  9.  
  10. if(proc=fork())
  11. {
  12. printf("Process: %i %x\n",getpid(),&value);
  13. waitpid(proc,&status,0);
  14. printf("%i \n",value);
  15. return 0;
  16. }
  17.  
  18. else
  19. {
  20. printf("Process: %i %i %x\n",getpid(),getppid(),&value);
  21. value = 2000;
  22. return 0;
  23. }
  24. }

para mas informacion:
Código:
man 2 fork


La familia exec()


Código:
int execl(const char *path, const char *arg, ...)
int execlp(const char *file, const char *arg, ...)
int execle(const char *path, const char *arg, ..., char * const envp[])
int execv(const char *path, char *const argv[])
int execvp(const char *file, char *const argv[])

Las funciones exec() remplazan el programa en ejecucion por otro programa dentro de un proceso. Inmediatamente se hace una llamada exec() el proceso en ejecucion se detiene y el nuevo programa inicia la ejecucion asumiendo que la llamada no tenga un error. Debido a que exec() remplaza el programa actual en ejecucion, este no retornara el control a menos que suceda un error o nuevo programa en ejecucion termine.

Veamos un pequeño ejemplo para utilizar fork() y exec() en el mismo programa:

Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. pid_t proc;
  8. int status,value=0;
  9.  
  10. if(proc=fork())
  11. {
  12. waitpid(proc,&status,0);
  13. printf("Clear Used \n");
  14. return 0;
  15. }
  16.  
  17. else
  18. {
  19. execvp("clear",argv);
  20. return 0;
  21. }
  22. }

Terminando un proceso


   Normalmente un proceso termina de dos formas. o llamando una funcion de salida, o por el valor de retorno. Cada proceso tiene un valor de salida. Cada proceso tiene un codigo de salida y ese codigo es devuelto a su proceso padre, entiendase por codigo el valor de retorno.

   En algunos casos necesitaremos cerrar un proceso, debido a que ya no lo necesitemos, para estos casos existe la funcion kill(). La funcion kill recibe 2 parametros. El primer parametro es el PID de un proceso o de un grupo de procesos. El segundo parametro es la señal, la cual es un valor constante.

Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <signal.h>
  5.  
  6. int main(int argc, char *argv[])
  7. {
  8. pid_t proc;
  9. int status,value=0;
  10.  
  11. if(proc=fork())
  12. {
  13. kill(proc,SIGTERM);
  14. if(status==0)printf("El proceso %i se ha cerrado \n",proc);
  15. return 0;
  16. }
  17.  
  18. else
  19. {
  20. while(1)printf("KILL ME. \n");
  21. }
  22. }

para mas informacion sobre kill():
Código:
man 2 kill

para mas informacion sobre el valor constante de las señales:
Código:
/usr/include/bits/signum.h

Esperando la terminacion de un proceso


   Debido a que el S.O. Linux es un sistema operativo multitareas cuando trabajamos con varios procesos, por ejemplo con una llamada a fork, no existe la certeza de cual proceso terminara primero. En algunas ocasiones necesitaremos esperar el valor de retorno de un proceso hijo o de multiples procesos hijos que habran realizado diferentes instrucciones y para estos casos existe la funcion wait().

Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. pid_t proc;
  8. int status,value=0;
  9.  
  10. if(proc=fork())
  11. {
  12. waitpid(proc,&status,0);
  13. if(status==0)printf("El proceso %i ha terminado con exito \n",proc);
  14. return 0;
  15. }
  16.  
  17. else
  18. {
  19. return 0;
  20. }
  21. }

para mas informacion:
Código:
man 2 wait
346  Foros Generales / Foro Libre / Re: amarres......hechizos ......brujería !!! en: 6 Octubre 2010, 01:54 am
Psss... Señores, existe el internet, la tecnologia y los celulares... dejen de creer en tonterias.
347  Programación / Java / Re: Escuchar Microfono en: 6 Octubre 2010, 01:49 am
Reproducir sonido por un microfono... WTF?
348  Programación / Scripting / Re: [python] Cadena de códigos en: 5 Octubre 2010, 19:05 pm
No se si existe una solucion dada pero aqui ahi algo:
Código
  1. a = raw_input("Ingrese una letra> ")
  2. if len(a)==1:
  3.    a = ord(a);
  4.    if a>=65 and a<=90 or a==165: print 'Mayuscula.\n'
  5.    if a>=97 and a<=122 or a==164: print 'Minuscula.\n'
  6.    else: print 'No ingreso una letra.\n'
  7. else: print 'Ingreso mas de una letra.\n'
349  Programación / Programación General / Re: PArticipa en la creación del nuevo lenguaje H++ 2.0 en: 5 Octubre 2010, 16:17 pm
Me imagino que saben ASM, la teoria de compiladores tambien y como funciona un pc internamente.
350  Foros Generales / Foro Libre / Re: porque si cuando nos bañamos quedamos limpios lavamos las toallas que usamos? en: 4 Octubre 2010, 21:36 pm
La humedad en la toalla crea germenes... se lava para eliminarlos.
Páginas: 1 ... 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ... 127
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines