Experimento simple de proceso e hilo

[Requisitos experimentales]:

  Aprenda el uso de la función fork, la función exec, la función pthread, lea el código fuente y analice el mecanismo de las tres funciones

[Implementación del código]:

  El proceso A crea el proceso hijo B

  El proceso A imprime hola mundo, el proceso B implementa la acumulación de suma

  El proceso B tiene dos subprocesos, el subproceso principal crea subprocesos para lograr la acumulación de suma

Análisis de información básica como el uso del procesador y la memoria de cada ejecutivo.

 

【Análisis】

Para escribir esto, primero mire la función pthread de fork exec.

Algunos blogs son útiles

https://www.cnblogs.com/amanlikethis/p/5537175.html

https://blog.csdn.net/nan_lei/article/details/81636473

https://blog.csdn.net/u011279649/article/details/18736181

Después de leer esto, básicamente puedes comenzar a escribir

El código fuente es muy simple, dividido en dos archivos, un hilo de procesamiento y un proceso de creación B

Procesar el main.c del proceso

1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 #include <unistd.h>
 5 #include <sys / types.h>
 6 #include <wait.h>
 7  
8  int main () {
 9      pid_t pid;
10      pid = tenedor ();
11      // dividir padre e hijo 
12      if (pid < 0 ) {
 13          printf ( " Bifurcación falló \ n " );
14          salida (- 1 );
15      }
 16 
17      más  if (pid == 0 ) {
 18          printf ( " Esto es hijo pid =% d. \ N " , getpid ());
19          // exec 
20          char * buf [] = { " / home / ying / experi-os / child " , " child " , NULL}; // el camino de b. 
21          execve ( " / home / ying / experi-os / child " , buf, NULL);
22      }
 23  
24      else {
 25          printf ( " ¡Hola mundo! Padre pid es% d. \ N" , getpid ());
 26          // Luego espere que el niño (B) haya terminado. 
27          wait (NULL);
 28          exit ( 0 );
 29      }
 30 }

También hay child.c que maneja hilos

1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 #include <unistd.h>
 5  
6  int x = 0 , sum = 0 ;
7  
8  void * Sum ( void * arg) {
 9      // printf ("¡la suma comienza con éxito! \ N"); 
10      para ( int i = 1 ; i <= x; i ++ ) {
 11          sum + = i;
12      }
 13      printf ( " \ nEl resultado es% d \ n ", suma);
14  }
 15  
16  int main ()
 17  {
 18      printf ( " exec success. \ NInput x: " );
19      if (scanf ( " % d " , & x)! = 1 ) {
 20          devuelve  0 ;
21      }
 22  
23      pthread_t id;
24      pthread_create (& id, NULL, Sum, ( void * ) NULL);
25      pthread_join (id, NULL); // espera fin de hilo 
26  
27      salida ( 0);
28      devuelve  0 ;
29 }

Luego compílelos por separado

1 gcc child.c -o child - lpthread
 2 gcc mian.c -o main

Correr es

1 ./principal

En este momento, debe prestar atención a la necesidad de agregar -lpthread a la compilación del hilo, porque parece que no hay una biblioteca predeterminada en Linux.

 

 

 

 Eso es todo!

 

[Resumen de ERROR]

Hubo varios errores durante el proceso de escritura.

1. La función de suma informa un error. La función Suma debe ser * Suma de acuerdo con los requisitos de parámetros formales del hilo

2. Main repite la definición. Dos archivos están vinculados por instrucciones ejecutivas, no por compilación de enlaces

3. Se informa un error de subproceso al compilar child.c. La razón es que no se agrega -lpthread

4. Error de tiempo de ejecución. Porque execve no apunta al archivo ejecutable de hilo correcto

Tenga en cuenta que los puntos anteriores no son básicamente un problema para este experimento, es realmente simple

Supongo que te gusta

Origin www.cnblogs.com/jhjgarden/p/12683459.html
Recomendado
Clasificación