C/Visual C - Problema/ejercicio en C

   
Vista:

Problema/ejercicio en C

Publicado por Mari Jose (2 intervenciones) el 27/12/2017 10:05:06
Buenas tardes,
Tengo que realizar un ejercicio en C y la verdad que ando algo perdida ( C no se me da bien). Me piden relizar el siguiente ejercicio; en C, añadir en una cabecera las siguientes funciones:

a_sem(S,tipo,N). Esta función la primera vez que se invoca en el código de un programa
crea un conjunto de semáforos de N elementos y comprueba que se ha creado con éxito. Una
vez creado el conjunto mediante el uso de una estructura de datos global asocia al primer semáforo
del conjunto el nombre especificado en S y el tipo especificado en tipo. Tanto el nombre
como el tipo son cadenas de caracteres. El tipo solo puede tomar dos valores: 'B' (binario) o 'G'
(general).
Cuando esta función se vuelve a invocar, puesto que el conjunto de semáforos ya está creado,
lo único que hace es asociar a otro semáforo del conjunto el nombre y el tipo especificados
como argumentos de entrada. Antes de realizar la asignación comprueba que existen semáforos
disponibles que no tienen un nombre asignado y comprueba que el tipo corresponde a uno de
los dos tipos permitidos.
Tanto en la primera como en las restantes invocaciones de esta función si alguna comprobación
no es positiva entonces se muestra en la pantalla un mensaje explicativo y finaliza la ejecución
del programa.
– i_sem(S,x). Esta función inicializa el semáforo de nombre S con el valor x. Antes de realizar
la inicialización comprueba que x cumple con las especificaciones asociadas al tipo de semáforo,
es decir, si es un semáforo binario x debe ser 0 o 1, y si es un semáforo general debe ser un
numero entero positivo mayor o igual a 0. Si la comprobación no es positiva entonces se muestra
en la pantalla un mensaje explicativo y finaliza la ejecución del programa.

Yo tengo hecho algo así de la primera parte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct sembuf decrementar[1]={0,-1,0};
struct sembuf incrementar[1]={0,1,0};
 
int semid;
int resultado;
 
void a_sem(int N)
{
    /*Crear u obtener un conjunto de semáforos de un semáforo (N=5) */
    semid=semget(CLAVE,5,IPC_CREAT|PERMISOS);
 
    if (semid==-1) /*Comprobar se ha habido algún error*/
    {
        printf("\nError");
        exit(-1);
    }
    /* Inicializar el semáforo a 1*/
    resultado= semctl(semid,0,SETVAL,val);
}

La verdad que no se muy bien como realizarlo. Alguien que me pueda dar alguna pista, o echar una mano, porfavor,
Mil gracias

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema/ejercicio en C

Publicado por Tom (562 intervenciones) el 28/12/2017 09:24:50
No sé para qué o por qué estás haciendo ese ejercicio pero ¿ no sería mejor que aprendieses a usar los semáforos POSIX (los System V que usas se consideran obsoletos -aunque funcionan-)?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema/ejercicio en C

Publicado por M (2 intervenciones) el 28/12/2017 19:56:31
Hola,
Me exigen hacerlo así, con System V).
Gracias

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema/ejercicio en C

Publicado por Tom (562 intervenciones) el 29/12/2017 11:24:59
Me parece un poco absurdo el ejercicio. Pero está claro que lo primero que deberás hacer (llevas muy poco) es buscar una manera de asociar el nombre que recibes (cadena de caracteres) con los números de cada semáforo.
Una forma es crear una estructura global que contenga a su vez un array de estructuras que contengan el nombre del semáforo y su número ...
... aunque probablemente, ya que los números de cada semáforo del set son consecutivos, en lugar de ese array de estructuras te valdría con una lista de nombres ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad