Escribir llamada al sistema en C++

Abdul Mateen 15 febrero 2024
  1. Llamada al sistema en C++
  2. la llamada al sistema escribir en C++
Escribir llamada al sistema en C++

Este tutorial discutirá el método para llamar al sistema de escritura desde un programa escrito en C++. Primero, actualizaremos rápidamente las llamadas al sistema, específicamente la llamada al sistema escribir y su prototipo.

Más adelante, discutiremos cómo llamar a la llamada al sistema escribir desde un programa C++.

Llamada al sistema en C++

Cada sistema operativo proporciona un conjunto de servicios a través de llamadas al sistema. Es un mecanismo para que los programas de computadora soliciten un servicio del sistema operativo.

Las llamadas al sistema proporcionan los siguientes servicios:

  1. Creación y gestión de procesos
  2. Gestión de la memoria principal
  3. Gestión de archivos y sistemas de archivos
  4. Entrada/salida del dispositivo
  5. Protección
  6. Trabajo en red

El servicio más frecuente que requieren los programas es el de entrada/salida. A continuación, vamos a discutir la llamada al sistema escribir.

Los programas solicitan al sistema operativo subyacente que escriba en algún dispositivo a través de llamadas al sistema de escritura.

Antes de avanzar hacia la llamada de escritura, es importante tener una idea sobre el descriptor de un archivo.

Descriptor de archivo

En Unix y los sistemas operativos basados en Unix, un descriptor de archivo es un número que identifica de manera única un archivo u otros recursos de IO como un socket o una tubería.

Normalmente, el descriptor de archivo es un valor entero no negativo. Los programas acceden a archivos para IO a través de descriptores de archivos.

Las funciones de la biblioteca tratan con IO y toman el descriptor de archivo como parámetro.

El primer paso es abrir un archivo por el nombre (ruta absoluta/relativa en caso de que el archivo no se encuentre en la carpeta del programa) para acceder a un archivo para IO.

Si la función open abre con éxito un archivo (es decir, existe un archivo con el mismo nombre y el usuario tiene los derechos necesarios), devuelve un descriptor de archivo.

int fd = open("abc.txt", O_RDONLY | O_CREAT);

La función open tiene dos parámetros. El primer parámetro es el nombre del archivo y el segundo es el modo de lectura (por ejemplo, modo de solo lectura, solo escritura, etc.).

Las operaciones de E/S subsiguientes en el archivo se realizan a través del descriptor de archivo.

la llamada al sistema escribir en C++

La llamada al sistema escribir es una de las rutinas más básicas proporcionadas por el núcleo del sistema operativo. Escribe datos de la memoria primaria (un búfer) en el archivo (almacenado en algún dispositivo de hardware).

La llamada al sistema write() escribe hasta count bytes desde el búfer de memoria apuntado por buf a un archivo al que hace referencia el descriptor de archivo.

Es una función de bajo nivel que solo es capaz de comprender bytes. La llamada escribir no se puede usar para escribir registros, como clases.

Por lo tanto, las funciones de entrada-salida de alto nivel (como printf()) son inevitables para realizar E/S complejas.

Primero veamos la sintaxis de la llamada al sistema escribir utilizada para escribir datos en un archivo.

ssize_t write(int fd, const void *buf, size_t count);

Los detalles de los tres parámetros de la función escribir son:

  1. El descriptor de archivo fd se obtiene de la llamada para abrir un archivo. Es un valor entero. Los valores 0, 1 y 2 también se pueden dar para entrada estándar, salida estándar y error estándar, respectivamente.
  2. El puntero a un búfer buf en la memoria donde se almacenan los datos en la memoria primaria.
  3. El número de bytes especificado por count que se escribirán en el archivo apuntado por fd desde el búfer buf.

Los tipos ssize_t y size_t son, respectivamente, tipos de datos enteros con y sin signo definidos en stddef.h.

Valor de retorno

La función escribir devuelve un valor con signo. En caso de éxito, devuelve el número de bytes escritos con éxito en el archivo, que a veces puede ser menor que el recuento especificado.

Las posibles razones para que el total de bytes escritos sea menor que el “recuento” pueden ser que la memoria del dispositivo de salida esté llena o que el búfer de escritura de origen tenga menos “caracteres” para escribir que el número especificado en el “recuento”.

En caso de error, la llamada al sistema escribir devuelve -1, y se establece errno para indicar el error encontrado.

Aquí tenemos un programa completo para escribir en el archivo usando la llamada al sistema escribir.

#include <errno.h>
#include <fcntl.h>

#include <iostream>

extern int errno;

using namespace std;

int main() {
  int fd, count;
  fd = open("abc.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
  cout << "File descriptor = " << fd << '\n';
  if (fd == -1) {
    // print which type of error have in a code
    printf("Error Number % d\n", errno);
    // print program detail "Success or failure"
    perror("Program");
  }
  char buff[] = "This is a test program to check write system call.";
  count = write(fd, buff, 50);
  if (count == -1)
    cout << "Error writing in file";
  else
    cout << "Number of bytes written to the file: " << count << '\n';
  close(fd);
  return 0;
}

El primer archivo de encabezado, fcntl.h, tiene una llamada al sistema escribir. El segundo archivo de encabezado tiene funciones de error.

En la llamada a la función open, creamos un nuevo nombre de archivo, abc.txt, en modo escritura. El archivo puede existir antes pero usando O_TRUNC, se eliminará el contenido anterior y se creará un nuevo archivo vacío.

El código 0644 indica los permisos del archivo. A continuación, la condición if comprueba si el archivo se abrió con éxito o no.

En caso de falla, se mostrará el mensaje de error.

A continuación, creamos una matriz de caracteres (para usar como búfer) con un texto de muestra. Finalmente, estamos escribiendo en el archivo.

El tercer parámetro es 50, indicando el número de caracteres a escribir de la matriz buff.

El recuento es el valor entero devuelto por la llamada a la API escribir(). En caso de fallo, el valor será -1; por lo tanto, verificamos el conteo e imprimimos el mensaje de error correspondiente.

En caso de una operación de escritura exitosa, tendremos un valor positivo de conteo, y la condición if mostrará el total de bytes escritos con éxito en el archivo.

escribir llamada al sistema

La primera salida, valor 3, muestra que el archivo se abrió con éxito. En la segunda línea, 50 muestra que los 50 bytes se escribieron correctamente.

A continuación, modificamos la declaración abierta.

fd = open("abc.txt", O_RDONLY | O_CREAT | O_TRUNC, 0644);

Note que hemos reemplazado O_WRONLY con O_RDONLY, y como resultado, la salida es:

File descriptor = -1
Error Number  13
Program: Permission denied
Error writing in file

Nuestra operación open falló porque es imposible abrir un archivo existente en modo lectura truncando el contenido.

Como resultado de la falla, puede ver que el descriptor del archivo es -1. Además, la operación de escritura no tiene éxito.

Si cerramos el archivo antes de la llamada al sistema escribir, el resultado será una operación fallida por una llamada al sistema escribir. En este caso, la salida debería ser algo como esto:

File descriptor = 3
Error writing in file

Aquí, el descriptor del archivo no es -1, pero el archivo está cerrado; por lo tanto, la llamada al sistema escribir falla.

El valor devuelto por la llamada al sistema escribir es -1. Por lo tanto, se imprime un mensaje de error.