Mostrando entradas con la etiqueta linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta linux. Mostrar todas las entradas

ejercicio de procesos ,tuberias con nombre y manejo de archivos en linux con lenguaje c

bueno nos pidieron hacer un programa hecho en C en el sistema operativo  ubuntu el cual era un laberinto el programa tendra la forma de comunicacion con tuberias con nombre el cual en un terminal se ejecuta la tuberia y se crea el laberinto (el laberinto va ser una matriz de 0 y 1 el cual 0 es muro y 1 es bien), el tamaño de la matriz va ser la que ingresa el usuario y el laberinto crea dinamicamente 0 y 1, en el segundo terminal va a llamar la tuberia con nombre y le enviara un mensaje de arriba,abajo,derecha,izquierda, el cual la tuberia recoje este dato y evalua si es arriba entonces en la posicion en que este el apuntador de la matriz subira una posicion y en el segundo terminal mostrara si es muro o si es bien en esa posicion de la matriz (la posicion de la matriz inicial siempre debe quedar en la mitad de la matriz)para el mensaje bien Ăł muro se manejara archivos en C tanto de lectura como de escritura.

bueno ahora el codigo estos codigos se pondran en la carpeta de usuario para su compilacion y ejecucion
primero creamos el primer programa que seria la tuberia y laberinto  este lo llamaremos tube.c


luego creamos el segundo programa el cual llamara a la primera tuberia e ingresara la palabra arriba,abajo,izquierda,derecha y mostrara si es muro Ăł bien este programa lo llamaremos llamatube.c


compilan los programas para que les cree el .exe y luego ejecutan, ejecutan el primero llamado tube.c luego abren otra terminal y ejecutan el segundo llamado llamatube.c con una de las 4 sentencias "arriba,abajo,derecha,izquierda" y eso es todo.

que son las tuberias con nombre en ubuntu y algunos ejercicios


Pipes con nombre:

Los pipes (tuberías) con nombre son una vía de intercambio de datos. Igual que los pipes estudiados se gestionan mediante el método FIFO, es decir, el primer byte introducido por el emisor será el primer byte en ser extraído por el receptor. Las tuberías con nombre también reciben el nombre de FIFOs. También son una vía de comunicación unidireccional como los pipes.

Diferencias con los pipes:
¨      Tienen un nombre, ocupando una entrada en el sistema deficheros. Se accede a Ă©l mediante un nombre de camino, igual que un fichero (se puede ver con la orden ls).
¨      Pueden intercomunicar procesos sin ningĂşn tipo de relaciĂłn, es decir, no tienen que estar emparentados como en los pipes. Esta caracterĂ­stica permite que los FIFOs puedan utilizarse para comunicar y sincronizar procesos de la misma máquina, sin necesidad de que lo hereden por medio de la llamada fork.
¨      Existen hasta que son borrados explĂ­citamente como cualquier fichero.

CreaciĂłn:

Hay varias formas de crear un FIFO. Se puede crear mediante mkfifo o bien mediante mknod. Tanto mkfifocomo mknod se pueden utilizar desde la lĂ­nea de Ăłrdenes o bien llamando al servicio correspondiente, como se detalla a continuaciĂłn:

¨      mkfifo en la lĂ­nea de Ăłrdenes:

mkfifo –m=modo_de_acceso nombre

modo_de_acceso representa los permisos asociados al FIFO. Por ejemplo:

            mkfifo –m=660   mififo
o
            mkfifo –m=”u+g=rw”   mififo

donde se está creando un FIFO de nombre mi mififo con permisos de acceso para el usuario y para el grupo de lectura y escritura.

¨      Servicio mkfifo:

El prototipo del servicio que permite crear una tuberĂ­a con nombre es el siguiente:

            int mkfifo( char *nombre, mode_t mode);

Los parámetros proporcionados son el nombre del FIFO y los permisos asociados. La llamada devuelve 0 si se ejecutĂł con Ă©xito o –1 en caso de error. Por ejemplo:

            Resultado= mkfifo(mififo, 660);

Crea el FIFO de nombre mififo con permisos de lectura y escritura para el usuario y el grupo.

¨      mknod en la lĂ­nea de Ăłrdenes:

mknod sirve para crear ficheros especiales. Un FIFO es considerado un fichero especial.

mknod –m=modo_de_acceso  nombre  tipo_fich_especial

Se indica el nombre, los permisos y el tipo de fichero especial, que para la creaciĂłn de un FIFO debe ser p indicando que es un pipe. Por ejemplo:

            mknod –m=660 mififo   p

¨      Servicio mknod:

El prototipo de este servicio es el siguiente:

            int mknod( char *nombre, mode_t mode, dev_t dev);

Los parámetros proporcionados son el nombre del FIFO y el modo de acceso incluyendo los permisos (para un FIFO se debe indicar S_IFIFO), el tercer parámetro en un FIFO es ignorado. La llamada devuelve 0 si se ejecutĂł con Ă©xito o –1 en caso de error. Por ejemplo:

            Resultado= mknod(mififo, S_IFIFO|660, 0);

Crea el FIFO de nombre mififo con permisos de lectura y escritura para el usuario y el grupo.

Una vez creada una tuberĂ­a con nombre se utiliza exactamente como un fichero. Recordamos a continuaciĂłn los servicios utilizados:

Apertura:

Se utiliza el servicio open. Su prototipo es el siguiente:

            int open(char *nombre, int flag);

El primer argumento indica el nombre del FIFO y el segundo la forma  en la que se va a acceder. Los posibles valores de flag son los siguientes:

O_RDONLY: se abre sĂłlo para realizar operaciones de lectura.
O_WRONLY: se abre sĂłlo para realizar operaciones de escritura.
O_RDWR: se obre para realizar operaciones de lectura y escritura.

El servicio open devuelve un descriptor de archivo que se puede utilizar para leer y escribir del FIFO. En el caso de error devuelve –1. La llamada open bloquea al proceso que la ejecuta hasta que haya algĂşn otro proceso en el otro extremo del FIFO. Si no interesa este comportamiento, se puede usar la bandera O_NONBLOCK en la llamada a open para desactivar esta opciĂłn por defecto.

Cierre:

Para cerrar un FIFO se utiliza el servicio close. Su prototipo es el siguiente:

            int close(int fd);

El argumento es el descriptor del archivo que se quiere cerrar, en este caso, el descriptor del FIFO devuelto en la apertura. La llamada devuelve 0 si se ejecutĂł con Ă©xito o –1 en caso de error.

Lectura:

Para leer de un FIFO se utiliza read. El prototipo es el siguiente:

            int read(int fd, char *buffer, int n);

El primer argumento es el descriptor del FIFO. El segundo argumento es la direcciĂłn del buffer de usuario donde se van a guardar los datos leĂ­dos. El Ăşltimo argumento es el nĂşmero de bytes que se quieren leer. La llamada devuelve el nĂşmero de bytes leĂ­dos o –1 en caso de error.

Escritura:

Para escribir en un FIFO se utiliza write. El prototipo es el siguiente:

            int write(int fd, char *buffer, int n);

El primer argumento representa el descriptor de archivo del FIFO. El segundo argumento especifica el buffer de usuario donde se encuentran los datos que se van a escribir al FIFO. El Ăşltimo argumento indica el nĂşmero de bytes a escribir. 

Una tubería debe tener un lector y un escritor. Si un proceso trata de escribir en una tubería que no tiene lectores asociados, el núcleo enviará la señal SIGPIPE.

NOTA: tambiĂ©n se pueden utilizar las funciones fopen, fclose, fputs, fgets … que utilizan FILE * en vez de int para indicar un fichero.


Borrado:

El prototipo del servicio utilizado para borrar un FIFO es:

            int unlink(char *fifo);

Esta llamada pospone la destrucción del FIFO hasta que todos los procesos que lo estén utilizando lo hayan cerrado con la función close.

Para borrar una tubería con nombre también se pueden utilizar la orden correspondiente del sistema operativo para el borrado de ficheros (rm).

Ejemplo: El siguiente programa crea un fifo de nombre mififo. En cada iteraciĂłn del bucle lee una cadena enviada por el proceso escritor:



2. ahora hacemos el programa que escribe en el fifo de nombre mififo.

si te sale error al compilar agrega esta libreria

entonces al ultimo programa el ejecutarlo solo le mandas una cadena solo una por que dos te sale error

ejercicios de procesos ó señales en ubuntu lenguaje c numero 5

contando que ya tienen actualizadas las librerias pretendemos a hacer el siguiente ejercicio  de señales echo en el lenguaje c miremos el enunciado:

5) elabore un programa el cual reciba la señal de usuario 1 SIGUSR1  y ejecute un comando del sistema operativo. codigo en lenguaje c:


lo guardan en el directorio del usuario compilan y ejecutan , en el terminal yo lo llame senal5.c si no saben compilar en el terminal de ubuntu
ponen lo siguiente en el terminal gcc senal5.c -o senal1  luego de esto lo ejecutamos asi

./senal5

ejercicios de procesos ó señales en ubuntu lenguaje c numero 4

contando que ya tienen actualizadas las librerias pretendemos a hacer el siguiente ejercicio  de señales echo en el lenguaje c miremos el enunciado:
4) elabore un programa el cual  se le pase el pid como parametro y diga si esta creado o no. codigo en c :



lo guardan en el directorio del usuario compilan y ejecutan , en el terminal yo lo llame senal4.c si no saben compilar en el terminal de ubuntu
ponen lo siguiente en el terminal gcc senal4.c -o senal4  luego de esto lo ejecutamos asi

./senal4

ejercicios de procesos ó señales en ubuntu lenguaje c numero 3

contando que ya tienen actualizadas las librerias pretendemos a hacer el siguiente ejercicio  de señales echo en el lenguaje c miremos el enunciado:

3)elabore un programa en el cual se le pasa el pid como parametro y diga si esta creado o no. codigo en c:




lo guardan en el directorio del usuario compilan y ejecutan , en el terminal yo lo llame senal3.c si no saben compilar en el terminal de ubuntu
ponen lo siguiente en el terminal gcc senal3.c -o senal3  luego de esto lo ejecutamos asi

./senal3

ejercicios de procesos ó señales en ubuntu lenguaje c numero 2


contando que ya tienen actualizadas las librerias pretendemos a hacer el siguiente ejercicio  de señales echo en el lengua c miremos el enunciado:

2)elabore un programa que cree un proceso, el proceso creado entre un ciclo infinito en el cual  se imprime un mensaje cada segundo  en el cual diga"yo soy el hijo". El proceso padre espera 20 segundos  y envia una señal al proceso para que termine. codigo en c:




lo guardan en el directorio del usuario compilan y ejecutan , en el terminal yo lo llame senal2.c si no saben compilar en el terminal de ubuntu
ponen lo siguiente en el terminal gcc senal2.c -o senal2  luego de esto lo ejecutamos asi

./senal2