Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2004, 03:15   #1
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
[c/c++]Ridefinire una funzione di libreria

Salve,

il mio obiettivo è di riuscire a ridefinire una funzione della libreiria del c, ad esempio la funzione exit( int ) che provoca l'uscita dal programma e che è definita in stdlib.h. Supponiamo che quando viene chiamata exit(n) io voglia eseguire una mia funzione myexit(n).

Per fare ciò ho definito un file stdlib.h che ho messo nella cartella locale del mio programma, e in cui importo la vera stdlib.h e subito dopo ridefinisco exit con myexit:

Codice PHP:
#ifndef MYSTDLIB_H
#define MYSTDLIB_H

//Con questa istruzione includo la libreria originaria; la
//includo riferendola col percorso completo per non confonderla
//col mio file stdlib.h
#include "/usr/include/stdlib.h"

//dichiaro il prototipo della mia funzione
void myexit(int);

//ridefinisco exit con myexit
#define exit myexit

#endif // MYSTDLIB_H 
L'implementazione della myexit è quindi messa in un file .c . Ora se nel mio programma includo <stdlib.h> e chiamo exit viene sempre eseguita la funzione standard della libreria. Come posso fare invece per far eseguire la mia?

Analogamente vorrei ridefinire una macro, assert, definita in asssert.h.

Grazie e ciao.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 10:32   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Metti l'include alla stdio.h originale nel file .c dove definisci la tua exit...il problema è che chiaramente sei costretto a ridefinire anche tutte le altre funzioni
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 13:30   #3
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Perche sono costretto a ridefinire tutte le funzioni? Nel mio stdlib.h faccio l'include all'originale stdlib.h, quindi le altre funzioni dovrebbero essere normalmente visibili.

Comunque non è questo il problema, il problema è che comunque nel mio programma viene importata la libreria originale e non la mia, come faccio a fargli importare la mia, fermo restando che nel programma ci deve essere comunque l'istruzione:

#include <stdlib.h>
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 13:37   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Allora non puoi farlo se nel programma deve rimanere #include <stdlib.h>

A meno di modificare lo stdlib.h originale...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 13:40   #5
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
ma nn c'era na funz on_exit((*void)()) che permetteva di usare una funz per pulire???
O è solo del GCC/Glibc?
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 13:42   #6
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
ecco qui:
Quote:
int atexit (void (*function) (void)) Function
The atexit function registers the function function to be called at normal program termination. The function is called with no arguments.
The return value from atexit is zero on success and nonzero if the function cannot be registered.

Esempio:
#include <stdio.h>
#include <stdlib.h>

void
bye (void)
{
puts ("Goodbye, cruel world....");
}

int
main (void)
{
atexit (bye);
exit (EXIT_SUCCESS);
}

__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 13:45   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Luc@s
ma nn c'era na funz on_exit((*void)()) che permetteva di usare una funz per pulire???
O è solo del GCC/Glibc?
E' ANSI...ma non so se sia questo quello che vuole fare...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 13:48   #8
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da cionci
E' ANSI...ma non so se sia questo quello che vuole fare...
magari lo aiuta.
Se no deve fare npo di casino
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 14:01   #9
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Nella soluzione suggerita da Luc@s se ho ben capito, si dice di richiamare una certa funzione all'uscita dal programma, però non mi permette di ridefinire la exit, cioè di rimpiazzarla completamente. In pratica io vorrei impedire l'uscita dal programma attraverso la exit.

Comunque al momento sarei piu interessato alla questione simile di ridefinire la macro assert che è definita in assert.h e che funziona cosi:

assert(condizione)

se condizione è true non succede nulla, se no viene stampato un messaggio d'errore e si invoca una funzione per uscire dal programma, mi sembra "abort".

Io vorrei ridefinire la macro assert in modo tale che non le faccio chiamare la funzione abort cosi non esco dal programma. Anche in questo caso assert.h è un file header della libreria del e viene incluso con

#include <assert.h>
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 14:04   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Hai provato con #undef ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 14:24   #11
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Cioè come dovrei usare undef?

Il mio obiettivo è riuscire a fare tutto senza toccare i sorgenti in cui vengono usate exit ed assert, ma riuscire a fare tutto in qualche altro modo, appunto definendo degli altri file con lo stesso nome degli header di libreria
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 14:27   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Per la exit lo puoi fare solo se metti mano a stdlib.h (a quella originale)...almeno credo...

Per assert se èuna macro puoi scrivere:

#undef assert

e poi rifai il #define come ti pare a te...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 15:05   #13
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Se scrivo undef assert e poi la ridefinizione nel file stesso che usa la assert funziona, io pero come ho detto volevo riuscire a fare la cosa senza toccare quel file, che si limita ad importare assert.h e volevo quindi riuscire ad oscurare l'originale assert.h con un mio assert.h che importa l'originale e poi fa l'undef e ridefinisce la macro; pero se faccio viene sempre visto l'assert.h originale, nonriesco ad oscurarlo.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 15:06   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Chiaro...come fa il compilatore a discriminare quale assert.h prendere ? Magari c'è qualche parametro da passare al compilatore, ma non ne sono a conoscenza...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 15:10   #15
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Mi pare che il prof mi avesse detto che il compilatore cercava prima nella directory corrente e poi nel path delle librerie del gcc, ma invece sembra che faccia il contrario
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 15:25   #16
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Sembra che l'opzione -I <percorso dei file header> faccia al caso mio
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 18:45   #17
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
uhm,se non vuoi guai è meglio non toccare le librerie.
Forse non ho capito bene ma io mi farei la mia funzione on_exit o similare che ha come parametro un puntatore a funzione(cioè l'operazione da compiere all'uscita) e che termina con l'exit standard.


Ma vedo ora che puoi adoperare anche il c++ e in questo caso una funzione con un template di function-object come parametro sarebbe senz'altro + elegante.
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2004, 21:52   #18
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
No, le funzioni di libreria non le tocco, anche per il fatto che questa cosa mi serve sono per uno specifico programma; comunque sono riuscito appunto a risolvere passando al compilatore l'opzione

-I .

con cui dico al compilatore di cercare i file header prima nella directory corrente in cui ho il mio stdlib.h che include quello originale.

Registrare delle funzioni da chiamare all'uscita del programma non mi basta perche il mio obiettivo è propio impedire l'uscita dal programma causato dalla exit,

OT x Verloc: se sei pratico di template tra un po posterò un thread per sapere se coi template posso ridefinire la malloc attraverso una funzione mymalloc parmetrica rispetto al tipo di ritorno; se puoi dacci uno sguardo
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2004, 21:09   #19
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Utilizzando l'opzione -I . con cui dico al compilatore di cercare i file header prima nella cartella locale sono riuscito a ridefinire la macro assert definendo un mio file assert.h all'intenro del quale ridefinivo assert come mi pare a me.

Ora pero con la exit nonriesco a fare la stessa cosa: ho fatto un file locale stdlib.h:

Codice:
//Con questa istruzione includo la libreria originaria; la 
//includo riferendola col percorso completo per non confonderla 
//col mio file stdlib.h 
#include "/usr/include/stdlib.h" 

//dichiaro il prototipo della mia funzione 
void myexit(int); 

//ridefinisco exit con myexit 
#define exit myexit
pero nel progrmma se chiamo exit viene sempre vista la funzione della libreira standar; perchè avviene questo se ho messo la macro

#define exit myexit

prima di compilare non dorebbe sostiuire le occorrenze di exit del mio programma con myexit??? Se la macro la metto esplicitamente nel programma funziona, ma io vorrei che fosse automaticamente includsa dal mio file stdlib.h
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals

Ultima modifica di anx721 : 19-04-2004 alle 21:15.
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2004, 17:26   #20
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Non so se fa al caso tuo, ma un modo semplice (che non richiede neanche di modificare il programma!) è creare una libreria .so con la tua funzione exit() modificata; quindi, per "sostituirla" a quella usata da un programma qualsiasi, invochi il programma con:
LD_PRELOAD=libmyexit.so <nome programma>
Per creare una libreria .so da un file .c puoi fare così:

Prima ti crei il file oggetto (non l'eseguibile!)
gcc -c -o file.o file.c
infine lo linki in una libreria dinamica:
ld -shared -o libmyexit.so file.o
Quindi sposti libmyexit.so in una dir di sistema (ad es. /usr/lib).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Un gruppo di ladri ha usato Google Maps ...
Apple non si fida di Samsung per la real...
Windows 11: un nuovo driver nativo mette...
Vi hanno regalato buoni Amazon? Intanto ...
Via acari, polvere e sporco da materassi...
Cuffie Beats in super offerta su Amazon,...
Xbox Cloud Gaming arriva su Amazon Fire ...
Un blackout a San Francisco manda in til...
Windows 11 è diventato più...
Apple cambia strategia a causa della cri...
007 First Light: uscita rimandata di due...
Samsung Galaxy A37 e A57: il comparto fo...
DAZN lancia la sua offerta di Natale: My...
Gigabyte fa marcia indietro? Sparito il ...
Alcuni rivenditori giapponesi bloccano l...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v