conceptos y procesos básicos relacionados con las funciones

Definición del proceso

Desde un punto de vista diferente, el proceso puede tener diferentes definiciones:

1. El proceso consiste en la ejecución del programa una vez

2. Los procesos son activos que se produce cuando un programa en el orden de ejecución y el procesador de datos.

3. El proceso es un proceso que tiene un programa independiente función se ejecuta en un conjunto de datos, que es una unidad separada de la asignación de recursos del sistema y programación

función de tenedor

头文件:
#include <sys/types.h>
#include <unistd.h>

原型:
 pid_t fork(void);

功能:fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。

返回值:在理解返回值之前,我们要明确fork函数作用,fork意思是复刻
,也就意味着一个进程调用fork函数相当于又复制一份一样的,而原来的进程我们叫做父进程,新产生的进程叫子进程,返回值pid_t代表进程ID,调用一次fork函数相当于有两个返回值,父进程的fork函数返回子进程id,子进程的fork返回0

caso

//创建5个子进程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
    pid_t pid;
    for(int i = 0; i < 5; i++){
        pid = fork();
        if(pid == -1){
            perror("fork");
            exit(1);
        }
        if(pid == 0){
            printf("i am child , pid = %d,ppid = %d\n",getpid(),getppid());
            break;
        }
    }
    return 0;
}

Nota : entre padres e hijos para seguir la copia en escritura lectura compartida principios, es decir, cuando padre e hijo están en una variable de sólo lectura, el espacio de las variables es la misma, pero cuando la escritura, se trata de dos espacios

[Enfoque en] la participación de padres e hijos: 1 archivo descriptor área de mapeo 2.mmap establecida

la familia de funciones exec

la familia de funciones exec proporciona una forma para iniciar otro programa para ser ejecutado en el proceso. Se puede encontrar el nombre de archivo o directorio del archivo ejecutable, y lo utilizan para reemplazar el segmento de datos del segmento proceso de llamada, el código y la pila original, después de realizar el proceso de contenido llamada original, además de la ID del proceso, el otro eran todos nuevos el proceso reemplazado, y el nuevo programa se ejecuta la rutina comienza la ejecución de inicio.
Aquí Insertar imagen Descripción

头文件:
#include <unistd.h>
原型:
int execl(const char *path, const char *arg, ... /* (char  *) NULL */);
int execlp(const char *file, const char *arg, ... /* (char  *) NULL */);
int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
参数:
path:要执行的程序路径。可以是绝对路径或者是相对路径。在execv、execve、execl和execle这4个函数中,使用带路径名的文件名作为参数。

file:要执行的程序名称。如果该参数中包含“/”字符,则视为路径名直接执行;否则视为单独的文件名,系统将根据PATH环境变量指定的路径顺序搜索指定的文件。

argv:命令行参数的矢量数组。

envp:带有该参数的exec函数可以在调用时指定一个环境变量数组。其他不带该参数的exec函数则使用调用进程的环境变量。

arg:程序的第0个参数,即程序名自身。相当于argv[O]。

…:命令行参数列表。调用相应程序时有多少命令行参数,就需要有多少个输入参数项。注意:在使用此类函数时,在所有命令行参数的最后应该增加一个空的参数项(NULL),表明命令行参数结束。

返回值:一1表明调用exec失败,无返回表明调用成功。

[Volcar imagen no pasa la cadena, la estación de origen puede tener mecanismo de cadena de seguridad, se recomienda guardar la imagen abajo cargado directamente (img-rSbeZyJz-1585572629939) (/ home / liuchenxu / .config / Typora / typora-user-images / 1585572542873.png )]

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("========================\n");

    char *argvv[] = {"ls", "-l", "-F", "R", "-a", NULL};
    

    pid_t pid = fork();
    if (pid == 0) {
        execl("/bin/ls", "ls", "-l", "-F", "-a", NULL);
        //while是一个可执行程序
        execl("./while","while",NULL);
        execv("/bin/ls", argvv);
        perror("execlp");
        exit(1);

    } else if (pid > 0) {
        sleep(1);
        printf("parent\n");
    }


    return 0;
}

función de espera

Huérfano
proceso hijo del proceso padre antes de que finalice el proceso que ha de adoptarse huérfanos proceso init, el proceso init se convierte en el padre del proceso de huérfanos
que es para liberar recursos del sistema ocupados por el proceso, después de recibir el proceso, el usuario puede liberar el espacio, no pueden liberar PCB, del mosto lanzado por los padres
zombi
muere proceso hijo, el proceso padre aún está vivo, no para liberar el proceso hijo PCB proceso padre, el proceso hijo se convierte en un proceso zombie

头文件:
#include<sys/types.h>
#include<sys/wait.h>
原型:
pid_t wait (int * status);
功能:
父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一
个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程
,wait就会一直阻塞在这里,直到有一个出现为止。
参数:
参数 status 是一个整形指针。如果status不是一个空指针,则终止进程的终止状态将存储在该指针所指向的内存单元中。
如果不关心终止状态,可以将 status参数设置为NULL。
返回值:
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。

Aquí Insertar imagen Descripción
Nota : Utilice la función de espera sólo se puede recuperar un proceso hijo

función waitpid

头文件:
#include<sys/types.h>
#include<sys/wait.h>
原型:
 pid_t waitpid(pid_t pid,int * status,int options);
 功能:如果在调用 waitpid()时子进程已经结束,waitpid()会立即返回子进程结束状态值。
  子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则
参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码。
参数:
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid 的子进程。
参数options提供了一些额外的选项来控制waitpid,参数 option 可以为 0 或可以用"|"运算符把它们连接起来使用,比如:
ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);如果我们不想使用它们,也可以把options设为0
返回值:如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回值-1。失败原因存于 errno 中。
Publicado 38 artículos originales · ganado elogios 39 · vistas 4449

Supongo que te gusta

Origin blog.csdn.net/qq_43799957/article/details/105208223
Recomendado
Clasificación