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

De Wikilibros, la colección de libros de texto de contenido libre.

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).