View Full Version : [C] Linux: syscall esecuzione file
foxmolder5
28-12-2006, 16:20
ho la necessità di fare un testing intensivo di un programma in base agli input forniti. la cosa + semplice sarebbe la realizzazione di uno script bash ma dovendo manipolare l'output di questo programma preferisco realizzare un prog in c che faccia tutto questo automaticamente.
infatti, il programma da testare lo chiamerò "ESEGUIBILE", e ci passerò tramite riga di comando diversi paramentri così da avere questo comando "ESEGUIBILE 125 100".
ho in mente quindi di realizzare un programma che mi esegua il comando "ESEGUIBILE x y" scegliando ogni volta valori di x e y differenti. metta ogni volta l'output in un file e poi mi modifichi il file a suo piacimento.
il primo problema che sto riscontrando è quale comando utilizzare per eseguire il comando "ESEGUIBILE x y" senza uscire dal programma. infatti se utilizzo la kiamata di sistema EXECVE il programma eseguito viene sostituo dal nuovo comando e quindi non potrò + continuare. mi sapete dare qualche consiglio?
grazie
non dirmi che non conosci la fork (http://www.linuxmanpages.com/man2/fork.2.php) :D
usa la fork ed esegui la exec nel processo figlio. Cerca sul man :)
foxmolder5
29-12-2006, 02:27
non dirmi che non conosci la fork (http://www.linuxmanpages.com/man2/fork.2.php) :D
infatti non avevo pensato di utilizzarla...ora ho trovato il modo. grazie a tutti :-)
foxmolder5
30-12-2006, 13:27
ora mi sono imbattutto in un nuovo problema.
l'execve deve mandare in esecuzione un file il cui output deve essere rediretto in un file di testo.
girando su internet ho visto che la cosa è possibile facendo eseguire alla execve uno script contenente " NOME_PROGRAMMA DA ESEGUIRE >> FILE_PER_OUTPUT " così tutto l'out viene reindirizzato su file.
il prob è che devo avviare il programma insieme ad alcuni valori passati per riga di comando e, non potendoli inserire nello script a priori, non so come passarli attraverso l'execve e farli riconoscere dallo script. ho provato ad inserirli nel array argv e poi a richiamarli nello script tramite %1 e %2 ma non risulta nulla. mi potete dare una mano?grazie
Potresti provare qualcosa del genere, costruendo 'al volo' l'array degli argomenti per execve():
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0) {
perror("fork()");
exit(EXIT_FAILURE);
}
if (pid == 0) {
// figlio
int fd;
fd = open("/tmp/log.txt",
O_WRONLY | O_CREAT | O_APPEND,
S_IRUSR | S_IWUSR | S_IRGRP);
if (fd < 0) {
perror("open()");
_exit(EXIT_FAILURE);
}
if (dup2(fd, STDOUT_FILENO) < 0) {
perror("dup2()");
close(fd);
_exit(EXIT_FAILURE);
}
close(fd);
// ho usato execlp per pigrizia
execlp("ls", "ls", "-l", NULL);
perror("execlp()");
_exit(EXIT_FAILURE);
} else {
// padre
int stat;
if (wait(&stat) < 0) {
perror("wait()");
exit(EXIT_FAILURE);
}
if (! WIFEXITED(stat))
puts("child error!\n");
}
return EXIT_SUCCESS;
}
foxmolder5
30-12-2006, 19:57
ti ringrazio per l'esempio di codice. quindi con il comando
dup2(fd, STDOUT_FILENO)
reindirizzo l'stdout sul file associato al file descriptor fd?
in quanto leggendo il man page non mi era molto chiara la funzione di tale syscall.
ti ringrazio per l'esempio di codice. quindi con il comando
dup2(fd, STDOUT_FILENO)
reindirizzo l'stdout sul file associato al file descriptor fd?
Sostanzialmente si, nel senso che dopo la chiamata i due file descriptor fanno riferimento allo stesso file aperto.
Buon Anno.
foxmolder5
01-01-2007, 16:32
Sostanzialmente si, nel senso che dopo la chiamata i due file descriptor fanno riferimento allo stesso file aperto.
Buon Anno.
infatti ho provato e ne ho scoperto il funzionamento.
però attualmente ho problemi con la execve in quanto non mi vengono riconosciuti correttamente gli argomenti passati insieme al programma.
io devo avviare:
programma -c NUMERO -k NUMERO /FILE_INPUT
ho provato a mettere ogni parametro all'interno di un campo dell'array arg ma mi da problemi.
e la stessa cosa avviene se uso la execlp in cui gli passo i vari valori da passare al programma.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.