fork + exec + la persona que llama no debe esperar al niño

Tengo dos scripts script_a y script_b. script_a llama a script_b. script_b bifurca dos procesos. Como se muestra abajo.

script_a espera a que finalicen tanto el padre como el hijo de script_b. Quiero que script_a continúe sin esperar el proceso secundario de script_b.

Lo que he hecho para esto está en script_b, he agregado el siguiente código.

if (! $f_id) {
    close STDOUT;
    close STDERR;
    exec("sleep 10; echo 'i am child'");
}

Esto funciona para mí. script_a ya no espera el proceso secundario.

Mi pregunta aquí es: 1. ¿Es esta la forma correcta de hacer esto? 2. ¿El proceso padre y el hijo comparten el mismo STDOUT y STDERR y terminaría en problemas si hay una condición de carrera? 3. ¿Hay mejores formas de hacer esto?

Gracias de antemano por la ayuda.

guión_a.pl

#! /usr/local/bin/perl
print `script_b.pl`;

guión_b.pl

#! /usr/local/bin/perl

$f_id = fork();

if (! $f_id) {
    exec("sleep 10; echo 'i am child'");
}

if ($f_id) {
    print "i am parent\n";
}

preguntado el 22 de mayo de 12 a las 09:05

1) puede bifurcarse en script_a, pero sin conocer su reales problema es difícil de decir. 2) El operador de comillas inversas simplemente establece un nuevo STDOUT para el niño. Sin embargo, STDERR se comparte. -

@Salva Esta es una versión reducida de mi código real, por lo que puede parecer que solo puedo bifurcar script_a, pero no es una opción para mí en el escenario real. ¿El padre y el hijo en script_b compartirían el mismo STDOUT y STDERR? -

La STDOUT/ESTDERR no se comparten. Para empezar, cuando se crea un hijo, todos los descriptores se heredan del padre. Se pueden manipular de forma independiente una vez bifurcados. -

Do guion_a y script_b necesitas comunicarte? Su muestra sugiere que A quiere la salida de B, pero ¿es representativa de los programas reales? ¿Por qué no es fork una opción en guion_a? -

@GregBacon Desde un script ficticio (script_a) ejecuto mi comando real (script_b) capturo su estado de salida y, según el estado de salida, envío correos. Como parte de su ejecución, este comando real se bifurca. Pero solo estoy interesado en el valor de retorno de los padres y no quiero esperar a que el niño se complete. -

2 Respuestas

En lugar de usar `` en script_a. Hemos redirigido STDOUT y STDERR en script_a. Algo como

guion_a

system("script_b.pl > /var/tmp/out_file 2>&1");

script_b

#! /usr/local/bin/perl

$f_id = fork();

if (! $f_id) {
    exec("sleep 10; echo 'i am child'");
}

if ($f_id) {
    print "i am parent\n";
}

De esta manera, la persona que llama no esperó a que se completara el niño en exec.

Gracias por la ayuda.

contestado el 24 de mayo de 12 a las 14:05

`` acentos graves en perl, espere a que se complete el comando. Entonces, si no desea que el proceso principal espere, póngalo sistema (comando &) en el fondo

contestado el 22 de mayo de 12 a las 11:05

Quiero esperar a que regrese el padre. Pero no quiero esperar al niño. ¿Podría decirme si la solución que he propuesto tiene algún problema? - Usha

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.