Pagina 1 di 1

problema system call C

Inviato: mercoledì 27 maggio 2015, 12:45
da gian2991
buongiorno,
per un progetto di universià dobbiamo fare un programma usando le system call invece delle normali istruzioni, purtroppo però il professore non spiega molto bene, e non ci ho capito molto.
ad esempio per richiedere di inserire un valore e poi stamparlo, come potrei fare?
sono riuscito a stampare ilo messaggio così: write(0,"inserisci valore",16);
anche se non capisco a cosa serva lo 0 passato come prim parametro, ora però il problema è usare una system call per assegnare a una variabile il valore che inserisco da tastiera.
grazie

Re: problema system call C

Inviato: mercoledì 27 maggio 2015, 13:38
da cortinico
Ciao,

Allora intanto la write deve essere fatta come primo parametro ad 1. Quello in sostanza è il file descriptor e il valore 0 sta per standard input, l'1 per standard output e il 2 per standard error.

Il codice per fare quello che vuoi tu è questo:

Codice: Seleziona tutto

#include <unistd.h>
#include <string.h>

int main(void){

	char buffer[50];
        // Azzera la memoria in modo che non ci siano problemi quando si va a leggere del buffer
	memset(buffer, '\0', 50);

	write(1,"inserisci valore \n",18);
	read(0,buffer, 50);
	write(1,buffer, 50);

	return 0;
}
Se vuoi chiarimenti chiedi pure

Re: problema system call C

Inviato: sabato 30 maggio 2015, 13:09
da gian2991
ciao, intanto grazie mille per l'aiuto, ho provato a fare alcune modifiche:

Codice: Seleziona tutto

#include <unistd.h>
#include <string.h>

void main(void){

   char buffer[50];
        // Azzera la memoria in modo che non ci siano problemi quando si va a leggere del buffer
   //memset(buffer, '\0', 50);
   int a=malloc(sizeof(int));
   write(1,"inserisci valore \n",18);
   read(0,a,1);
   write(1,a,1);
   free(a);
   getchar();
   getchar();
}
a me serviva un int come variabile, per non dovermelo convertire dai char, allora ho fatto cosi, da quello che ho capito l'ultimo parametro della read e della write mi dice quanti caratteri prendere in considerazione, quindi penso che così vada bene

Re: problema system call C

Inviato: sabato 30 maggio 2015, 13:37
da cortinico
In realtà non è propriamente corretto (malgrado mi pare funzioni comunque).
Infatti stai utilizzando una malloc (che torna un void *, quindi un puntatore) per assegnare il suo valore di ritorno ad un intero.
Inoltre non ho ben capito a cosa servono le getchar in fondo, ti sconsiglio di utilizzare getchar miste a systemcall (tipo le read/write), in quanto spesso le funzioni di libreria sono bufferizzate, mentre le syscall no (non mi pare getchar entri in questo insieme, comunque è sempre bene essere prevenuti).

Ti allego il codice

Codice: Seleziona tutto

#include <stdlib.h>
#include <unistd.h>

int main(void){

   int * a = (int *) malloc(sizeof(int));
   write(STDOUT_FILENO,"inserisci valore \n",18);

   read(STDIN_FILENO, a, sizeof(int));
   write(STDOUT_FILENO, a, sizeof(int));
   free(a);

   return 0;
}
Come vedi ho sostituito i valori numerici 1 e 0 con le macro STDIN_FILENO e STDOUT_FILENO, ti possono tornare più comode e rendono più leggibile il codice

Re: problema system call C

Inviato: sabato 30 maggio 2015, 20:10
da gian2991
le getchar() le ho usate perchè se no non vedevo a video i risultati, nel programma finale le toglierò, cmq grazie dei consigli, spero di venirne fuori