Una llamada al sistema (system call, syscall) es el mecanismo mediante el cual un programa en modo usuario solicita un servicio al Sistemas Operativos/Kernel. Es la verdadera interfaz entre los programas y el Sistemas Operativos.
Tanenbaum la ilustra con read(fd, buffer, nbytes):
read de libc).syscall en x86-64, svc en ARM), que cambia a modo kernel y salta a una dirección fija.Una syscall se parece a una llamada a procedimiento, pero cruza la frontera usuario/kernel, lo que la hace mucho más costosa.
| Llamada | Descripción |
|---|---|
pid = fork() |
Crea un proceso hijo idéntico al padre |
pid = waitpid(pid, &status, opts) |
Espera a que termine un hijo |
s = execve(name, argv, envp) |
Reemplaza la imagen del proceso |
exit(status) |
Termina el proceso |
| Llamada | Descripción |
|---|---|
fd = open(file, how, ...) |
Abre un archivo |
s = close(fd) |
Cierra un archivo |
n = read(fd, buf, nbytes) |
Lee datos |
n = write(fd, buf, nbytes) |
Escribe datos |
pos = lseek(fd, offset, whence) |
Mueve el puntero del archivo |
s = stat(name, &buf) |
Obtiene información de estado |
mkdir, rmdir, link, unlink, mount, umount.
chdir, chmod, kill, time.
while (TRUE) {
type_prompt();
read_command(command, parameters);
if (fork() != 0) {
/* Código del padre */
waitpid(-1, &status, 0);
} else {
/* Código del hijo */
execve(command, parameters, 0);
}
}
Windows separa las llamadas reales del kernel de la API pública Win32 (CreateProcess, WaitForSingleObject, CreateFile, ReadFile...). Las llamadas internas cambian entre versiones; la API se mantiene estable.