Foros del Web » Programación para mayores de 30 ;) » C/C++ »

c en linux:semáforos

Estas en el tema de c en linux:semáforos en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 25/01/2008, 02:53
Avatar de Estefania76  
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 16 años, 5 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!!
  #2 (permalink)  
Antiguo 25/01/2008, 04:34
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 4 meses
Puntos: 606
Re: c en linux:semáforos

Es muy sencillo. Un semáforo és simplemente un número. Cuando alguien coje el semáforo lo aumenta, y cuando lo libera disminuye.

Esto a nivel básico. Si necesitas guardar más información, tendrás que crear una estructura que permita guardar una lista (o tabla) con el pid de los procesos, por ejemplo.

Lo importante es que te quede claro su funcionamiento e implementación básica (lo del contador que se suma o resta), luego ya es cuestión de añadir de cosecha própia Si tienes alguna duda avisa, hice el PFC sobre el código de Linux y tengo bastante por la mano como funcionan sus semáforos, paso de mensajes, memoria compartida, etc.


Nota: Las funciones que tu has puesto son las que el própio Linux implementa en su código, y que son visibles vía librería de código de C.
  #3 (permalink)  
Antiguo 28/01/2008, 02:31
Avatar de Estefania76  
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: c en linux:semáforos

Gracias Malenko!!

Intentaré hacerlo, y cuando lo tenga lo pongo en este foro y te lo hago saber....
me has dado una idea, a ver si lo consigo...porque yo y el C no nos llevamos demasiado bien... prefiero javascript, aunque si sabes un lenguaje de programación, prácticamente, casi todos se parecen o se pueden intuir...

Bueno, lo dicho, pondré la soulción, gracias.
  #4 (permalink)  
Antiguo 28/01/2008, 03:00
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 5 meses
Puntos: 24
Re: c en linux:semáforos

Cita:
Iniciado por Malenko Ver Mensaje
Es muy sencillo. Un semáforo és simplemente un número. Cuando alguien coje el semáforo lo aumenta, y cuando lo libera disminuye.
Si pero ....

Has de implementar algún mecanismo de bloqueo para evitar que un proceso lea/escriba del semáforo cuando otro proceso lo está haciendo en ése mismo instante.
__________________
Grupos de Música
Pop Music Stars
  #5 (permalink)  
Antiguo 28/01/2008, 03:07
Avatar de Estefania76  
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: c en linux:semáforos

Ok aloqui, lo tendré en cuenta, muchas gracias :)

Los dos programas que tengo que hacer es que uno de ellos escriba en un fichero y el otro lea ese fichero y lo visualices por pantalla. Tengo que lanzar los dos a la vez pero el segundo, aunque lo lance a la vez que el primero, tiene que ejecutarse después, mediante semáforos.

saludos!
  #6 (permalink)  
Antiguo 28/01/2008, 11:26
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 4 meses
Puntos: 606
Re: c en linux:semáforos

Cita:
Iniciado por aloqui Ver Mensaje
Si pero ....

Has de implementar algún mecanismo de bloqueo para evitar que un proceso lea/escriba del semáforo cuando otro proceso lo está haciendo en ése mismo instante.
Es que precisamente la función de un semáforo es servir de mecanismo de bloqueo...

http://en.wikipedia.org/wiki/Semaphore_%28programming%29
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:20.