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:
- Creación y gestión de procesos
- Gestión de la memoria principal
- Gestión de archivos y sistemas de archivos
- Entrada/salida del dispositivo
- Protección
- 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:
- El descriptor de archivo
fd
se obtiene de la llamada para abrir un archivo. Es un valor entero. Los valores0
,1
y2
también se pueden dar para entrada estándar, salida estándar y error estándar, respectivamente. - El puntero a un búfer
buf
en la memoria donde se almacenan los datos en la memoria primaria. - El número de bytes especificado por
count
que se escribirán en el archivo apuntado porfd
desde el búferbuf
.
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.
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.