Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
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


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
Il nuovo Snapdragon 8 Elite Gen 6 sar&ag...
Nintendo Switch 2: risultati sotto le at...
Weekend con tante sorprese su Amazon: to...
HONOR non si ferma più: il 2025 &...
Speciale best seller: EUREKA J15 Evo Ult...
Roborock Q10 X5+ da 10.000 Pa a 199€ &eg...
E-mail reset password di Instagram: la c...
La NASA ha discusso le problematiche del...
Il razzo spaziale NASA SLS e la capsula ...
Stazione Spaziale Internazionale: Crew-1...
Samsung Galaxy S26 Ultra: la ricarica de...
Apple ha un nuovo partner per la sua App...
Trenitalia introduce il prezzo dinamico ...
OnePlus non si ferma più: c'&egra...
DAZN sconta il piano Full per 6 mesi, se...
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: 10:47.


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