|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2001
Messaggi: 2514
|
[C] Linux: syscall esecuzione file
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 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
usa la fork ed esegui la exec nel processo figlio. Cerca sul man
![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Dec 2001
Messaggi: 2514
|
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 Ultima modifica di foxmolder5 : 30-12-2006 alle 12:45. |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Potresti provare qualcosa del genere, costruendo 'al volo' l'array degli argomenti per execve():
Codice:
#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; } |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2001
Messaggi: 2514
|
ti ringrazio per l'esempio di codice. quindi con il comando
Codice:
dup2(fd, STDOUT_FILENO) in quanto leggendo il man page non mi era molto chiara la funzione di tale syscall. |
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Quote:
Buon Anno. |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Dec 2001
Messaggi: 2514
|
Quote:
però attualmente ho problemi con la execve in quanto non mi vengono riconosciuti correttamente gli argomenti passati insieme al programma. io devo avviare: Codice:
programma -c NUMERO -k NUMERO /FILE_INPUT e la stessa cosa avviene se uso la execlp in cui gli passo i vari valori da passare al programma. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:06.