|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6851
|
[C] output system function
Ciao,
come posso fare per redirigere ad esempio in una stringa un comando eseguito con system() ? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
s/o?
__________________
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 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6851
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Con system non è semplice (anche se c'è un modo contorto). Meglio usare la popen.
Usare direttamente fork+dup(stdin/out/err su un tuo pipe)+exec ti da la maggiore flessibilità, se popen non ti basta.
__________________
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 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6851
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Per curiosità, questo è il crapposauro necessario per la system
Codice:
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int main(void)
{
char buf[64];
int fd;
char *my_str;
off_t sz;
sprintf(buf, "/tmp/__tmpXXXXXX");
fd = mkstemp(buf);
unlink(buf);
sprintf(buf, "ls >&%d", fd); // !!!
system(buf);
sz = lseek(fd, 0, SEEK_CUR);
my_str = mmap(NULL, sz, PROT_READ, MAP_SHARED, fd, 0);
close(fd);
dprintf(fileno(stdout), "Output del comando: ");
write(fileno(stdout), my_str, sz);
dprintf(fileno(stdout), "\n");
munmap(my_str, sz);
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 |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6851
|
Codice:
char comm[256];
int dim_input_file
strcpy(comm, "ls -lrt /home/ | grep file.trc | awk '{print $5}'");
char out[256];
FILE* file_info = popen(comm , "r");
while (fgets( out, sizeof(out), file_info));
{
dim_input_file = atoi(out);
}
In alcuni sistemi va in altri no. Ovviamente lo stesso file è presente in tutti i sistemi. Ultima modifica di Unrue : 18-07-2008 alle 09:10. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6851
|
Quote:
Codice:
write(fileno(stdout), my_str, sz); Ultima modifica di Unrue : 18-07-2008 alle 14:23. |
|
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non mi dire che hai VERAMENTE utilizzato quella roba
Quote:
I file descriptor aperti vengono preservati tali dopo fork+exec (a meno che non imposti il flag "close on exec"). Questo è il trucco che ho usato. Quote:
Controlla inoltre che sz>0, altrimenti vai di sicuro in segvault in quanto la mappa è di dimensione 0 (come ci vai di sicuro se tenti di scrivere sulla regione, visto che è senza PROT_WRITE). Occhio inoltre che la stringa non termina con '\0' (per questo ho usato la write e non la dprintf o printf!)
__________________
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 Ultima modifica di ilsensine : 18-07-2008 alle 15:37. |
||
|
|
|
|
|
#10 | |
|
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 |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6851
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:31.












Beh, ma non dovrebbe comunque generare un SIGFAULT.








