problema system call C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

problema system call C

Messaggio 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
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: problema system call C

Messaggio 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
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: problema system call C

Messaggio 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
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: problema system call C

Messaggio 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
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: problema system call C

Messaggio 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
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti