Ich habe ein Verhalten, das ich nicht verstehe. Beim Aufruf der Funktion gibt get_bloccante_multimsg (...) nichts zurück, die Variable read_m wird nicht valorisiert und der nächste Befehl wird nicht ausgeführt.Funktion liefert keinen Wert in c
Der folgende Code ist ein Teil des Programms, hoffe, dass es hilfreich ist, um das Problem zu identifizieren.
buffer.h
msg_t* get_bloccante_multimsg(int buffer, int C_id, int semid, const int N);
buffer.c
msg_t* get_bloccante_multimsg(int buffer, int C_id, int semid, const int N)
{
char* string;
char* shared_memory;
int *Cindex;
struct shmid_ds shmbuffer;
sb.sem_num = PIENE;
sb.sem_op = -1;
sb.sem_flg = 0;
if (semop(semid, &sb, 1) == -1) {
perror("semop() consumatore P(PIENE)");
exit(-9);
}
sb.sem_num = USO_T;
sb.sem_op = -1;
sb.sem_flg = 0;
if (semop(semid, &sb, 1) == -1) {
perror("semop() consumatore P(USO_T)");
exit(-9);
}
Cindex = shmat(C_id, NULL, 0);
shmctl(buffer, IPC_STAT, &shmbuffer);
shared_memory = (char *) shmat(buffer, (void *)0, 0);
memcpy(string, &shared_memory[*Cindex*20], 20);
*Cindex = (*Cindex + 1) % N;
shmdt(Cindex);
shmdt(shared_memory);
sb.sem_num = USO_T;
sb.sem_op = 1;
sb.sem_flg = 0;
if (semop(semid, &sb, 1) == -1) {
perror("semop() consumatore V(USO_T)");
exit(-9);
}
sb.sem_num = VUOTE;
sb.sem_op = 1;
sb.sem_flg = 0;
if (semop(semid, &sb, 1) == -1) {
perror("semop() consumatore V(VUOTE)");
exit(-9);
}
return msg_init_string(string);
}
main.c
msg_t *read_m;
for (int i = 0; i < C; i++)
{
// fork consumatore
cons_pid[i] = fork();
switch(cons_pid[i]) {
case -1: // fork fallita
exit(-5);
break;
case 0:
read_m = get_bloccante_multimsg(segment_id, C_id, semid, N);
printf("Messaggio in array: %s", (char *)getMessage(read_m));
exit(0);
break;
default:
break;
}
}
Vielen Dank für Ihre Hilfe.
memcpy(string, &shared_memory[*Cindex*20], 20);
und später an:
return msg_init_string(string);
Dies führt zu undefiniertem Verhalten
Wo ist die 'msg_init_string()' Funktion, und was ist ihr Rückgabewert? Ich sehe auch keine Zuweisung für den Speicher, auf den "string" zeigt, aber Sie verwenden 'memcpy()', um Daten in diesen Speicher zu kopieren. –
Dank David, habe ich die Zuordnung zu String hinzugefügt und alles funktioniert. –