|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Per come sono fatti i sistemi unix, sono semplicemente "file descriptor". Non c'è molta differenza se un descriptor è aperto su un char device (un terminale, ad es) o un file ( ls > file.txt). Dal punto di vista del programma, cambia ben poco: ovviamente però alcuni fd supportano alcune cose (ad es. i terminali supportano molte delle ioctl di termios), mentre un file supporterà altre cose (ad es. la mmap).
Prova questo programma ad esempio: Codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
int main()
{
void *addr = mmap(NULL, getpagesize(), PROT_READ,
MAP_SHARED, fileno(stdin), 0);
if (addr==MAP_FAILED) {
perror("mmap");
} else {
fprintf(stderr, "stdin mmapped!\n");
munmap(addr, getpagesize());
}
return 0;
}
./programma sia come touch testfile.txt; ./programma < testfile.txt e confronta i risultati Puoi sapere cosa è effettivamente connesso a un file descriptor come stdin|out|err tramite la funzione fstat. La usano ad esempio alcuni programmi che chiedono la password, per essere sicuri che stdin è effettivamente un terminale. Infine, giusto per generare un pò di ulteriore confusione Codice:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
char buf[4096];
int sz, pos;
dprintf(fileno(stdout), "Ho scritto su stdout.\n");
dprintf(fileno(stderr), "Ho scritto su stderr.\n");
dprintf(fileno(stdin), "Ho scritto...su stdin!!!\n");
dprintf(fileno(stdout), "\nOra scrivi qualcosa e premi <invio>.\n");
sz = read(fileno(stdin), buf, sizeof(buf));
(sz>0) && !(buf[sz-1] = '\0') &&
dprintf(fileno(stdout), "Ho letto '%s' da stdin.\n", buf);
dprintf(fileno(stdout), "Ora scrivi qualcos'altro e premi <invio>.\n");
sz = read(fileno(stderr), buf, sizeof(buf));
(sz>0) && !(buf[sz-1] = '\0') &&
dprintf(fileno(stdout), "Ho letto '%s' da stderr!!!\n\n", buf);
for (pos=0; pos<110; ++pos)
dprintf(pos%3, "%c", "yeeeeep!!!\n"[pos%11]);
return 0;
}
__________________
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 |
|
|
|
|
|
#22 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
La dup2 l'ho provata in un po' tutte le posizione
Grazie a tutti cmq dell'aiuto. |
|
|
|
|
|
#23 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
ciao ilsensine, ho provato i 2 programmi, grazie mille che il tuo tempo... scusa se ci ho messo cosi tanto ma dovevo finire la tesi senti, ma io il secondo non l'ho mica capito sai? ok che non conosco bene il c e non conosco le spec della funzione read, ma mi stai dicendo che hai rimappato al volo lo stdin sullo stderr?? |
|
|
|
|
|
|
#24 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Ovviamente è sbagliato fare questa assunzione; i tre descrittori possono essere connessi a tre cose diverse (o avere attributi diversi: sola lettura per stdin, sola scrittura per stdout e stderr). Esegui questo ad esempio: ls -l /proc/self/fd/ 0</dev/zero 1>out.txt 2>/dev/null; cat out.txt
__________________
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 |
|
|
|
|
|
|
#25 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
In effetti é leggibilissimo anche qui. Prendo nota
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#26 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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 |
|
|
|
|
|
|
#27 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Si ho letto della portabilitá del dprintf e in effeti fa un pó ridere
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#28 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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 |
|
|
|
|
|
|
#29 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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 |
|
|
|
|
|
|
#30 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
(mettici ció che vuoi) && (mettici ció che vuoi) && ... io uso cose del genere in bash (magari piú complesse ma il succo é questo): Codice:
test -z "$NAME" && NAME=LOCALE Tutto qua
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#31 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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 |
|
|
|
|
|
|
#32 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
pensa che qui la shell usata é la sh ![]() devono riscrivere tutto sempre e comunque! mi son dovuto scaricare la bash ed installarla di nascosto sulla mia macchina e su le alfa. Per fortuna che si sta migrando a linux
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#33 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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 |
|
|
|
|
|
|
#34 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:49.




















