En Linux, el comando de acceso se usa para verificar si el programa que llama tiene acceso a un archivo específico. Se puede utilizar para comprobar si un archivo existe o no. La comprobación se realiza utilizando el UID y GID reales del proceso de llamada.
int access(const char *pathname, int mode);
Aquí, el primer argumento toma la ruta al directorio/archivo y el segundo argumento toma las banderas R_OK, W_OK, X_OK o F_OK .
- Indicador F_OK : se utiliza para verificar la existencia del archivo.
- Indicador R_OK : se utiliza para verificar el bit de permiso de lectura.
- Indicador W_OK : se utiliza para verificar el bit de permiso de escritura.
- Indicador X_OK : se utiliza para verificar el bit de permiso de ejecución.
Nota: si access() no puede acceder al archivo, devolverá -1 o será 0.
Ejemplo 1: indicador F_OK
#include<stdio.h> #include<unistd.h> #include<errno.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> extern int errno; int main(int argc, const char *argv[]){ int fd = access("sample.txt", F_OK); if(fd == -1){ printf("Error Number : %d\n", errno); perror("Error Description:"); } else printf("No error\n"); return 0; }
Explicación: en la salida, recibimos el mensaje «Sin error» porque el archivo está presente en el directorio actual. Si el archivo no existe, el valor de fd será -1. En el código anterior, la única forma posible de obtener un error es si el archivo no existe para la ruta especificada. También puede dar un error si el nombre de la ruta es demasiado largo.
Nota: perror() se usa para imprimir el error y errno se usa para imprimir el código de error.
Ejemplo 2: comprobar todos los bits de permiso (leer, escribir, ejecutar)
#include<stdio.h> #include<unistd.h> #include<errno.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> extern int errno; int main(int argc, const char *argv[]){ int fd = access("sample.txt", (R_OK | W_OK) & X_OK); if(fd == -1){ printf("Error Number : %d\n", errno); perror("Error Description:"); } else{ printf("No error\n"); } return 0; }
Explicación: en la salida, se establecieron los bits de permiso de usuario de escritura y ejecución y, dado que estábamos probando un caso en el que (R_OK | W_OK) y X_OK , no obtenemos ningún error. El valor del descriptor de archivo es 0. Podemos usar operaciones bit a bit para decidir el argumento del modo en la llamada al sistema access().
Ejemplo 3: verifique todos los bits de permiso (lectura, escritura, ejecución) para demostrar cómo funciona el código, cuando obtenemos un error.
#include<stdio.h> #include<unistd.h> #include<errno.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> extern int errno; int main(int argc, const char *argv[]){ int fd = access("sample.txt", R_OK & W_OK & X_OK); if(fd == -1){ printf("Error Number : %d\n", errno); perror("Error Description:"); } else{ printf("No error\n"); } return 0; }
Aquí, fd = -1 y obtenemos el mensaje de error debido a la falla del proceso de llamada.