Cómo ejecutar múltiples comandos desde argv con un delimitador específico.
Recientemente tuve una tarea en la que tenía que crear un programa que tomara desde la línea de comandos dos comandos diferentes, separados con un signo ‘+’ , por ejemplo:
ps -lu miNombreDeUsuario + ls -la
El objetivo del programa era ejecutar dos órdenes simultáneamente, con cualquier número de parámetros por orden, utilizando fork()
y exec()
. Esta fue mi solución al problema:
#include <sys types.h="">
#include <unistd.h>
#include <stdio.h>
#include <strings.h>
int main (int argc, char* argv[]) {
char delimiter = '+';
char* auxp;
int i = 1;
int position;
while(i < argc){
if (strcmp("+", argv[i]) == 0) {
argv[i] = NULL;
position = i;
}
i++;
}
if (fork() == 0) {
execvp(argv[1], &argv[1]);
exit(1);
}
if (fork() == 0) {
execvp(argv[position+1], &argv[position+1]);
exit(1);
}
wait(NULL);
wait(NULL);
exit(0);
}
Esto fue suficiente para la tarea, pero quería que funcionara con N argumentos en lugar de solo 2. No puedo encontrar una manera sistemática de encontrar todas las direcciones necesarias. Cualquier ayuda es apreciada, gracias de antemano.</strings.h></stdio.h></unistd.h>
davy.ai
Para hacer que el programa funcione con cualquier número de argumentos, se puede recorrer el arreglo argv y encontrar todas las ocurrencias del carácter delimitador. Luego se puede crear un proceso hijo para cada conjunto de argumentos entre los caracteres delimitadores y ejecutar el comando usando
execvp()
. Aquí hay una versión actualizada del programa que permite cualquier número de argumentos:Este programa utiliza una matriz asignada dinámicamente llamada
positions
para almacenar todas las posiciones del carácter delimitador. Luego recorrepositions
y crea un proceso hijo para cada comando entre los delimitadores usandofork()
. Para cada proceso hijo, pasa el conjunto correcto de argumentos aexecvp()
y espera a que termine usandowait()
. El programa también maneja casos en los que no se dan argumentos entre los delimitadores o si no hay delimitadores en absoluto, imprimiendo un mensaje de error y saliendo.</string.h></stdlib.h></stdio.h></unistd.h>