Bash, garfo com CLOEXEC

3

O Bash pode executar um subprocesso enquanto impede que um subprocesso herde um descritor de arquivo?

if flock -nx 9
then
  # If begin program runs away, it will keep the lock.
  begin program
else
  echo "Lock held :/)" >&2
fi 9> /tmp/lk
    
por solidsnack 22.06.2016 / 21:29

1 resposta

3

Tanto quanto eu sei, não. Você tem que fechá-lo manualmente:

if flock 9 -nx
then
   program 9>&- #<= manual close of fd 9 after 'program' has forked but before it execs
else
  echo "Lock held :/)" >&2
fi 9> /tmp/lk

Se você quiser obter mais hacky, pode definir o sinalizador chamando a função fcntl diretamente por meio de ctypes.sh :

#!/bin/bash

echo initial
ls /proc/$$/fd/

echo with 9
{

ls /proc/$$/fd/

echo with 9 in an execced child
bash -c ' ls /proc/$$/fd/'

} 9</etc/passwd


echo
echo BEGIN MAGIC
FD_CLOEXEC=1
FD_SETFD=2

. ctypes.sh
echo initial
ls /proc/$$/fd/

echo with 9
{

dlcall fcntl int:9 int:$FD_SETFD int:$FD_CLOEXEC

ls /proc/$$/fd/

echo with 9 in an execced child
bash -c ' ls /proc/$$/fd/'

} 9</etc/passwd

Saída:

initial
0
1
2
255
with 9
0
1
2
255
9
with 9 in an execced child
0
1
2
3
9

BEGIN MAGIC
initial
0
1
2
255
with 9
0
1
2
255
9
with 9 in an execced child
0
1
2
3

(Não é um erro de digitação na colagem - o 9 realmente se fechou quando o filho foi executado).

    
por 22.06.2016 / 21:37

Tags