Mentre penso di avere la comprensione di come fork()
, exec()
, wait()
e pid
funzionano in C, non ho ancora trovato un modo per eseguire un programma personale da un programma.Come eseguire un programma dall'ingresso del terminale (linux)?
Ecco il mio codice:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h> /* for fork() */
#include<sys/types.h> /* for pid_t */
#include<sys/wait.h> /* fpr wait() */
int main(int argc, char* argv[])
{
char fileName[255];
pid_t pid;
switch (pid = fork()) {
case -1: //Did not fork properly
perror("fork");
break;
case 0: //child
execv(fileName[0],fileName);
puts("Oh my. If this prints, execv() must have failed");
exit(EXIT_FAILURE);
break;
default: //parent
//Infinite Loop
while (1) {
printf(" %s > ", argv[0]);
scanf("%s", fileName); // gets filename
if (fileName[0] == '\0') continue;
printf("\n Entered file: %s",fileName); // prints the fileName
waitpid(pid,0,0); /* wait for child to exit() */
break;
}
}
return 0;
}
Le mie domande sono le seguenti:
voglio prendere una stringa come input e voglio limitare il campo di applicazione a 255 caratteri.
char fileName[255]
e poiscanf("%s", fileName);
la strada da percorrere? Dovrei usaregetLine()
o qualche altra funzione?Diciamo che l'input è preso correttamente. Come posso dire di dire un programma Hello Hello esistente. L'input verrà archiviato in
*argv[]
? Ho scoperto che in un programma diverso potrei usarestatic char *argv[] = { "echo", "Foo is my name." , NULL }; execv("/bin/echo", argv);
per echo "Foo è il mio nome". Posso fare qualcosa di simile con un programma helloWorld?
Grazie per la vostra risposta rapida ed esauriente. L'unica parte della tua domanda che non riuscivo a capire completamente era il presupposto che impostassi fileName su un valore. Intendi inizializzazione? In tal caso, non l'ho fatto. Ho bisogno di? Nella mia mente, quando il programma girava, chiedeva all'utente e l'utente digita qualcosa come "./helloWorld" o "/bin/./helloWorld". E questo sarebbe il valore di fileName. –
La digitazione del nome è ciò che intendevo impostando 'fileName' su un valore '. Come scritto, si stava usando una stringa di caratteri non inizializzata come comando, che è improbabile che funzioni bene. Finché imposti 'fileName' su qualcosa di leggermente appropriato in qualche modo, dovresti essere OK. Sia './HelloWorld' e'/bin /./ helloWorld' funzionerebbero, anche se '. /' Non è necessario ('execv()' non è influenzato da '$ PATH', e se si specifica solo' helloWorld', sarà trattato come './helloWorld'). '/ Bin /./ helloWorld' è iffy; il '/./' potrebbe essere solo '/' e non si dovrebbe mettere il software in '/ bin'. –