[ Foro de C ]
Pregunta:
error: expected identifier or ‘(’ before ‘switch’
Me aparece este error en la traza ------- switch(pid=fork()){------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
#include <sys/sem.h>
#include <fcntl.h>
#include <dirent.h>
#define sem0 0 // ID del semáforo 0
#define sem1 1 // ID del semáforo 1
#define KEY 2
#define TAM_CADENA 0777
#define TAM_BUFFER 0777
int main(){
int semid;/*ID al conjunto de semaforos*/
struct sembuf sem_oper; /* Para las operaciones wait y signal con semáforos */
union semun {
int val;
struct semid_ds *semstat;
unsigned short *array;
} arg;
/* Creamos un conjunto de 2 semáforos */
semid = semget (KEY, 2, 0777 | IPC_CREAT);
if (semid == -1) {
printf("\nError en la creación de los semáforos");
exit(1); /* Error 1: error en la creación de semáforos */
}
/* Inicializamos los semáforos */
arg.array = (unsigned short *) malloc (sizeof (short)*2);
arg.array[sem0] = 0;
arg.array[sem1] = 1;
semctl (semid, 2, SETALL, arg);
/* Eliminamos el conjunto de semáforos */
semctl (semid, 2, IPC_RMID, 0);
/* liberamos la memoria dinámica */
free (arg.array);
struct Buffer{
char stringArchivo[TAM_CADENA];
}buffer, *addr;
int shmid;
shmid = shmget(KEY,sizeof(struct Buffer)*TAM_BUFFER, 0777 |IPC_CREAT);
if (shmid==-1) {
printf("\nError en la creacion de la Memoria compartida");
exit(1);/*Error 1: error al acceder a la Memoria compartida*/
}
/*Enlazar la memoria compartida al proceso*/
addr = shmat(shmid, 0, 0);
DIR*dir = NULL;//opendir retorna tipo DIR O NULL
struct dirent*fx = NULL;
int pid, status;
int in, out;
}
--------------------switch(pid=fork()){-----------------------------------
printf("Error no se ha creado el hijo");
exit(1);
break;
case 0://El hijo es igual al consumidor
dir = opendir(argv[1]);
while ((fx = readdir(dir))!= NULL){
sem_oper.sem_num = 1; /*Seleccionamos el semaforo 0*/
sem_oper.sem_op = -1;/*Decrementar 1 (hace un wait)*/
sem_oper.sem_flg = SEM_UNDO;
semop(semid,%sem_oper,1);
buffer = addr[out];
out = (out+1)%TAM_BUFFER;
sem_oper.sem_num = 0; /*Seleccionamos el semaforo 0*/
sem_oper.sem_op = 1; /*Incrementamos en 1, SIGNAL*/
sem_oper.sem_flg = SEM_UNDO;/*Evitar interbloqueos*/
semop(semid,%sem_oper,1);
printf("%s \n",buffer.stringArchivo);
break;
default://padre es igual al productor
dir = opendir(argv[1]);
if(dir == NULL){
printf("Directorio no existente\n");
exit(1);
}
while((fx = readdir(dir)) != NULL){
strcpy(buffer.stringArchivo,fx->d_name);//Buffer[in] = elemento producido//
sem_oper.sem_num = 0;/*Seleccionamos el semaforo 0*/
sem_oper.sem_op = -1;/*Decrementar 1 (hace un wait)*/
sem_oper.sem_flg = SEM_UNDO;
semop(semid,%sem_oper,1);
addr[in] = buffer;//
in = (in+1)%TAM_BUFFER;
sem_oper.sem_num =1;/*Seleccionamos el semaforo 1*/
sem_oper.sem_flg = SEM_UNDO;/*Evitar interbloqueos*/
semop(semid,%sem_oper,1);
}
wait(%status);
break;
}
}
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)