Salvo algún otro comentario, no lo puedes saber: system() ejecuta el comando, pero no regresa hasta que éste termine, así que no podemos saber el PID del proceso en ese momento, porque el proceso ya terminó.
system() no devuelve el PID, sino el resultado de la ejecución.
Sí que podríamos saber el PID si lanzáramos el proceso en segundo plano (
background) -con '&' al final del comando, por ejemplo-, y mirando la tabla de procesos del sistema, pero, atención: esos procesos serán hijos del proceso padre de todo el sistema (el 1), ya que les hemos lanzado de esa manera. Si conoces sus nombres, entonces ya lo tienes todo.
Otra forma de lanzar procesos es entubando sus salidas o entradas hacia/desde nosotros (algo parecido a lo que ya hace open3).
Pero lo principal: system(ls) solo regresa cuando 'ls' termina. Mientras, tu programa Perl queda 'congelado'.
Un ejemplo en Perl lineal:
Using bash Syntax Highlighting
perl -le '$cmd = "sleep 200"; system("$cmd \&"); $proceso = (grep { / $cmd$/ } qx(ps --ppid 1 -o "ppid,pid,cmd"))[-1]; ($pid) = $proceso =~ /(\d+) $cmd/; print $pid'Coloreado en 0.006 segundos, usando
GeSHi 1.0.8.4
Aquí, estamos ejecutando el comando
sleep 200 en segundo plano. Luego, sacamos la lista de procesos que se llamen igual y que su padre sea el '1', y nos quedamos con el último (
[-1]) de ellos. Y de él, pintamos su PID.
Se podría mejorar añadiendo a la selección hecha por
ps que el usuario efectivo (euser) sea el que ejecutó el programa Perl.