Primeros pasos con la programación de Linux - Subprocesos

  

Las noticias de la tienda de computadoras introducen primero lo que es un subproceso. La mayoría de los programas que escribimos pueden considerarse como de un solo subproceso. El programa se ejecuta en un cierto orden. Si usamos subprocesos, el programa creará una línea en nuestra línea. El lugar se bifurca y se convierte en dos "programas" en ejecución. Aproximadamente parece ser similar al proceso secundario, pero no lo es. El proceso secundario se ejecuta copiando el espacio de direcciones del proceso principal. El hilo es compartido por El código del programa a ejecutar, el punto popular es que el mismo código del subproceso se ejecutará varias veces. La ventaja de usar el subproceso es que puede ahorrar recursos, ya que el subproceso lo comparte, por lo que la programación del proceso no es tan complicada. El uso de la creación de subprocesos se implementa mediante las siguientes funciones: #include < pthread.h > int pthread_create (pthread_t * thread, pthread_attr_t * attr, void * (* start_routine) (void *), void * arg); Void pthread_exit (void * retval); int pthread_join (pthread * thread, void ** thread_return); pthread_create crea un hilo, el hilo se usa para indicar el ID del hilo creado, attr Indique los atributos cuando se crea el hilo, usamos NULL para indicar el uso del atributo predeterminado. El puntero de la función start_routine es la función que comienza a ejecutarse después de que el hilo se crea correctamente, arg es el único parámetro de esta función. Indica el parámetro que se pasó a start_routine. Pthrea d_exit function La función de salida es similar a salir del subproceso. Esta función finaliza el subproceso, libera los recursos de la función y bloquea al final hasta que otros subprocesos lo esperen mediante la función pthread_join. Luego pasa el valor de * retval a ** thread_return. Desde que se libera esta función, Los recursos de la función, por lo que retval no puede apuntar a la variable local de una función. Pthread_join se usa para esperar el hilo especificado como la llamada en espera. Vamos a usar un ejemplo para explicar el uso. En la práctica, a menudo tenemos que hacer una copia de seguridad de algunos archivos. Se puede hacer una copia de seguridad de todos los archivos del directorio actual. El sufijo de copia de seguridad se llama bak #include < stdio.h > #include < unistd.h > #include < stdlib.h > #include &string; string.h > # Incluir < errno.h > #include < pthread.h > #include < dirent.h > #include < fcn Tl.h > #include < sys /types.h > #include < sys /stat.h > #include < sys /time.h > #define BUFFER 512 struct copy_file {int infile; int outfile;}; void * copy (void * arg) {int infile, outfile; int bytes_read, bytes_write, * bytes_copy_p; char buffer [BUFFER], * buffer_p; struct copy_file * file = (struct copy_file *) arg; infile = file- > infile; Outfile = file- > outfile; /* Como el subproceso sale, se libera todo el espacio variable, así que tenemos que asignar memoria nosotros mismos * /if ((bytes_copy_p = (int *) malloc (sizeof (int))) == NULL) pthread_exit (NULL); bytes_read = bytes_write = 0; * bytes_copy_p = 0; /* Recuerde cómo copiar los archivos * /while ((bytes_read = read (infile, buffer, BUFFER))! = 0) {if ((bytes_read == - 1) &&(errno! = EINTR)) break; else if (bytes_read > 0) {buffer_p = buffer; while ((bytes_write = write (outfile, buffer_p, bytes_read))! = 0 {if ((bytes_write == - 1) &&(errno! = EINTR)) break; else if ((bytes_write == bytes_read) break; else if (bytes_write > 0) {buffer_p + = bytes_write; bytes_read- = bytes_wr Es decir,}} if (bytes_write == - 1) break; * bytes_copy_p + = bytes_read;}} close (infile); close (outfile); pthread_exit (bytes_copy_p);} int main (int argc, char ** argv) {pthread_t * thread; struct copy_file * file; int byte_copy, * byte_copy_p, num, i, j; nombre de archivo char [BUFFER]; struct dirent ** namelist; struct stat filestat; /* Obtener todos los archivos (incluidos los directorios) en la ruta actual Número * /if ((num = scandir (". &Quot;, &namelist, 0, alphasort)) < 0) {fprintf (stderr, " Error de número de archivo:% s \\ n \\ a " Strerror (errno)); salida (1)

Copyright © Conocimiento de Windows All Rights Reserved