[ Foro de C ]

error: expected identifier or ‘(’ before ‘switch’

24-Oct-2021 23:02
Invitado (Jesus16)
0 Respuestas

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.)