A função execvp em C

  1. Use a função execvp para substituir uma imagem de processo em C
  2. Trate adequadamente os cenários de erro de chamada de função execvp e envie mensagens correspondentes
  3. Use execvp com a função fork para criar um processo filho e executar um programa diferente em C

Este artigo irá demonstrar vários métodos sobre como usar a função execvp em C.

Use a função execvp para substituir uma imagem de processo em C

Em sistemas baseados em Unix, há duas chamadas de sistema separadas para criar um novo processo e carregar um novo código de programa em um processo em execução. O último é feito usando a família exec de funções de biblioteca que são apenas interfaces diferentes para a chamada de sistema execve. Existem 6 protótipos de função diferentes: execlp, execle, execv, execvp e execvpe. Essas funções recebem um nome de arquivo ou caminho de um novo arquivo de programa para carregar e executar como o primeiro argumento. execvp também recebe un array de argumentos do programa como o segundo argumento.

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

int main(void) {
    const char *args[] = { "vim", "/home/ben/tmp3.txt", NULL };

    execvp("vim", args);

    exit(EXIT_SUCCESS);
}

Trate adequadamente os cenários de erro de chamada de função execvp e envie mensagens correspondentes

Observe que as funções da família exec só retornam se ocorrer um erro, por isso é importante implementar rotinas de verificação de erros e lidar com os caminhos de código correspondentes conforme necessário. execvp entre eles retorna -1 em caso de falha, e também define a variável errno. Lembre-se, porém, que errno deve ser explicitamente definido como 0 antes da chamada da função e apenas verificar o valor quando a chamada dada retornar. A função execvp pode receber o nome do arquivo sem barras, o que implica que o arquivo é pesquisado em diretórios conforme especificado pela variável de ambiente PATH.

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

int main(void) {
    const char *args[] = { "vim", "/home/ben/tmp3.txt", NULL };

    errno = 0;
    if (execvp("vim", args) == -1) {
        if (errno == EACCES)
            printf("[ERROR] permission is denied for a file\n");
        else
            perror("execvp");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
}

Use execvp com a função fork para criar um processo filho e executar um programa diferente em C

Alternativamente, suponha que o usuário precise criar um novo processo e executar o código de programa fornecido. Nesse caso, podemos utilizar a chamada de função fork combinada com execvp. fork duplica o processo de chamada e cria um novo chamado - o processo filho. No exemplo a seguir, implementamos um wrapper de função personalizada para criar um novo processo e carregar / executar o código de programa fornecido. Observe que, uma vez que um processo filho é criado, ele executa um código diferente e o processo pai espera até que o filho saia.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>

pid_t spawnChild(const char* program, char** arg_list)
{
    pid_t ch_pid = fork();
    if (ch_pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (ch_pid > 0) {
        printf("spawn child with pid - %d\n", ch_pid);
        return ch_pid;
    } else {
        execvp(program, arg_list);
        perror("execve");
        exit(EXIT_FAILURE);
    }
}

int main(void) {
    const char *args[] = { "vim", "/home/ben/tmp3.txt", NULL };

    pid_t child;
    int wstatus;

    child = spawnChild("vim", args);

    if (waitpid(child, &wstatus, WUNTRACED | WCONTINUED) == -1) {
        perror("waitpid");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
}

Artigo relacionado - C Process

  • Kill a Child Process em C
  • Use a função sched_setaffinity em C