es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Un programa en lenguaje C (Linux) que hace lo mismo que el nice -n [número] [proceso].

Necesito escribir un programa en C que lance otro programa con una prioridad modificada, de manera similar a como lo hace el comando nice. Para hacer eso, me gustaría encontrar el PID de un proceso dado como argumento (¿cómo puedo hacer eso?) y modificar su nivel de prioridad (¿cómo puedo hacer eso?).

Ejemplo: La línea de comandos podría ser ./a.out 5 sleep 500 &, y esto debería producir el mismo efecto que nice -n 5 sleep 500&.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para encontrar el PID de un proceso dado como argumento en un programa en C, puedes utilizar las funciones getpid() y getppid() de la biblioteca unistd.h. La función getpid() devuelve el PID del proceso que la llama, mientras que la función getppid() devuelve el PID del proceso padre.

    Para modificar el nivel de prioridad de un proceso en un programa en C, puedes utilizar la función setpriority() de la biblioteca sys/resource.h. Esta función toma tres argumentos: la constante PRIO_PROCESS, que indica que el nivel de prioridad debe modificarse para un proceso específico, el PID del proceso y un valor de prioridad que varía de -20 (mayor prioridad) a 19 (menor prioridad).

    Aquí tienes un ejemplo de cómo podrías implementar esta funcionalidad en un programa en C:

    #include <stdio.h>
    #include <unistd.h>    // para getpid(), getppid()
    #include <sys resource.h="">   // para setpriority()
    
    int main(int argc, char *argv[]) {
    
        // comprueba que los argumentos de la línea de comandos sean correctos
        if (argc != 4) {
            printf("Uso: ./a.out <prioridad> <comando> <tiempo>\n");
            return 1;
        }
    
        // extrae el nivel de prioridad del primer argumento
        int prioridad = atoi(argv[1]);
    
        // crea un nuevo proceso y ejecuta el comando con la prioridad modificada
        pid_t pid = fork();
        if (pid == 0) {
            // proceso hijo
            // modifica el nivel de prioridad
            if (setpriority(PRIO_PROCESS, 0, prioridad) != 0) {
                perror("setpriority");
                return 1;
            }
            // ejecuta el comando
            if (execlp(argv[2], argv[2], argv[3], NULL) == -1) {
                perror("execlp");
                return 1;
            }
        } else if (pid > 0) {
            // proceso padre
            // muestra el PID del proceso hijo
            printf("PID del hijo: %d\n", pid);
        } else {
            // error
            perror("fork");
            return 1;
        }
    
        return 0;
    }
    

    Este programa toma tres argumentos de línea de comandos: el nivel de prioridad, el comando a ejecutar y el tiempo de espera. Utiliza atoi() para extraer el valor entero del argumento de prioridad. Luego crea un nuevo proceso y modifica el nivel de prioridad utilizando setpriority() en el proceso hijo. Finalmente, el proceso hijo utiliza execlp() para ejecutar el comando dado con el tiempo de espera indicado. El proceso padre muestra el PID del proceso hijo.</unistd.h></stdio.h>

Comments are closed.