68 / Sistemas

Control de Procesos

Nyx provee builtins POSIX de procesos: getpid, getcwd, chdir, isatty, stat. Estos son los bloques de construcción de las herramientas de línea de comandos y de los shells.

68-process-control.nxFuente →
// Process control — pid, working directory, environment
// Control de procesos — pid, directorio de trabajo, entorno

fn main() -> int {
    // Get current process ID
    let pid: int = getpid()
    print("my pid: " + int_to_string(pid))

    // Get current working directory
    let cwd: String = getcwd()
    print("cwd: " + cwd)

    // Check if stdout is a terminal
    let is_tty: bool = isatty(1)
    if is_tty {
        print("stdout is a terminal")
    } else {
        print("stdout is not a terminal (piped)")
    }

    // File stat
    let info: Array = stat("/tmp")
    let is_dir: int = info[3]
    if is_dir == 1 {
        print("/tmp is a directory")
    }

    // Change directory and back
    let original: String = getcwd()
    chdir("/tmp")
    print("changed to: " + getcwd())
    chdir(original)
    print("back to: " + getcwd())

    return 0
}
Salida ilustrativastdout
my pid: 1501659
cwd: /tmp/demo
stdout is not a terminal (piped)
/tmp is a directory
changed to: /tmp
back to: /tmp/demo

Cómo funciona

getpid() devuelve el ID del proceso actual. getcwd() devuelve el directorio de trabajo actual como string. chdir(path) cambia el directorio de trabajo.

isatty(fd) verifica si un descriptor de archivo corresponde a un terminal. El descriptor de archivo 0 es stdin, 1 es stdout, 2 es stderr. Esto es útil para decidir si emitir códigos de color o prompts interactivos.

stat(path) devuelve metadatos de un archivo o directorio como [size, mode, mtime, is_dir, is_regular]. La bandera is_dir (índice 3) es 1 para directorios, 0 en caso contrario. Estos primitivos son los que usa un shell escrito en Nyx para sus comandos incorporados.