Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/01/2008, 02:53
Avatar de Estefania76
Estefania76
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 16 años, 6 meses
Puntos: 0
c en linux:semáforos

Hola a todos,

Tengo una duda, y es que,para linux, tengo que hacer que dos programas en c se lancen a la vez, mediante un script y que el segundo se ejecute después del primero mediante semáforos.

El problema es que en c ya hay unas funciones que sirven para crear el semáforo:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semget(key_t clau,int nsems, int semflg);

Si esta función va bien devuelve el identificador del conjunto de semáforos. En caso contrario, devuelve-1.
clau: se obtiene con ftok
nsems: número de semáforos que queremos crear
semflg: flags ya vistos



para tener acceso a un semáforo:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semop(int semid,struct sembuf *sops,unsigned,nsops)


semid: identificador IPC
nops: número de semáforos sobre los que queremos efectuar la operación
sops: tabla(con tanto elementos como nops) de estructuras sembuf:
struct sembuf
{
short sem_num; / nº del semáforo sobre el que queremos trabajar
short sem_op; / operacion a realizar (antes acceso < 0 liberar >0 bloquear / proceso=0)
short sem_flg; / flags (SEM_UNDO: la operacion se deshace cuando el proceso acaba
/ IPC_NOWAIT: el proceso no se queda esperando en cola, / sino que recibe un mensaje de error
}


Para controlar un semáforo:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semctl(int semid,int semnum,int cmd,union semnum arg);

semid: identificador IPC
semnum: indica el semáforo del conjunto
cmd: comando:
IPC_STAT: vuelca la información del semáforo a una estructura definida en arg
IPC_SET: modifica los valores del semáforo que esta permitido modificar
IPC_RMID: elimina el semáforo
GETALL: obtiene el valor de todos los semáforos de todas las estructuras de semáforos
GETNCNT: indica el número de procesos que estan bloqueados esperando para el semáforo semnum
GETPID: retorna el PID del último proceso que ha hecho la llamada semop sobre el ssemáforo semnum
GETVAL: retorna el valor del semáforo semnum
GETZCNT: indica el número de procesos que esperan para el semáforo
SETALL: asigna valores a todos los semáforos de la estructura. Se les pasa el valor por una tabla a arg
SETVAL: fija un valor para un semáforo específico para semnum


arg: es una union (como un struct, pero tiene la longitud del campo mas grande)


Bueno, pues el problema es que no puedo utilizxar ninguna de estas funciones para crear el semáforo para poder hacer que un programa se ejecute después del otro habiéndolos lanzado los dos a la vez, sino que me obligan a hacer semáforos "caseros", es decir, sin las funciones estas de c, hechos por mi, y yo no tengo ni idea, alguien me podria dar una pista?o una pequeña ayuda?

muchas gracias.

Saludos!!