Introducción a Sistemas Operativos y al Kernel 2.6 de Linux/Capítulo 4 - Llamadas del sistema

En este capítulo aprenderemos:

  • Qué es una llamada al sistema (syscall).
  • En que categorías se agrupan.
  • Qué hacen y cómo se usan.


Introducción editar

En la informática, una llamada al sistema o interrupción de software es un mecanismo usado por un programa para efectuar tareas específicas del sistema operativo o kernel. Por lo común sirve para realizar tareas como acceso al hardware, manejo de memoria, operaciones I/O... Y se dividen en llamadas al sistema para el manejo de ficheros, de procesos y de memoria.

A este tipo de funciones corresponde la jerarquía de archivos de cabecera situada en /usr/include/linux o /usr/local/include/linux por defecto.

¿Qué es POSIX? editar

POSIX (Portable Operating System Interface) es una familia de normas IEEE que define un estándar de llamadas al sistema.

Gestión de procesos editar

En esta categoría se agrupan todas las llamadas al sistema que se encargan de la gestión de procesos.

getpid editar

pid_t getpid(void);

Devuelve la PID (Process ID) del programa.

getuid editar

uid_t getuid(void);

Devuelve la UID (User ID) del usuario que está ejecutando el programa. Sirve para saber si el usuario root (UID 0) o un usuario normal (UID superior a 0) está ejecutando el programa, entre otras cosas.

getgid editar

gid_t getgid(void);

Devuelve la GID (Group ID) del grupo al que pertenece el usuario que ejecuta el programa.

fork editar

pid_t fork(void);

Crea un proceso hijo del proceso desde el que se ejecuta. Esto es debido a que todos los procesos corriendo en un sistema Linux parten de init, el primer proceso que se ejecuta en la máquina, y se van ramificando. Si todo va bien, devuelve el PID del proceso hijo. Si hay algún error, devuelve -1.

Entre sus usos, ejecutar un programa externo al mismo tiempo que el nuestro sin necesidad de recurrir a los hilos (threads) manualmente.

Ver "/usr/src/linux/kernel/fork.c".

execve editar

int execve(const char *filename, const char *argv[], const char *envp[]);

Ejecuta el fichero filename, ya sea binario o script ejecutable. A ese programa se le pasan como argumentos la matriz argv, y como variables de entorno la matriz envp (donde las variables de entorno tienen la sintaxis <clave>=<valor>).

Si no hay errores, execve no regresa. En caso de error, devuelve -1.

nice editar

int nice(int nic);

Cambia la prioridad de ejecución del proceso que lo llama, añadiendo nic al indicador de prioridad (cuanto menor sea el indicador de prioridad, más recursos le dedicará el SO).

Sólo el superusuario puede aumentar la prioridad de un proceso, usando nic con un valor negativo. Esta función devuelve 0 en caso de éxito y 1 si hay algún error.

Ver "/usr/src/linux/kernel/sys.c".

kill editar

#include <sys/types.h>

  1. include <signal.h>

int kill(pid_t pid, int sig);

Envía la señal sig al proceso pid. Si pid es 0, envía la señal a todos los procesos del grupo en el que esté el proceso actual. Si pid es -1, se envía la señal a todos los procesos que se pueda (excepto al proceso 1, init).