onde são dados gravados no descritor de arquivo que nunca foi aberto

1

Eu tenho a saída capturada pelo seguinte comando:

$ strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/

é um pouco longo, então eu carreguei aqui . Agora quero fazer algumas análises neste arquivo.

A seguinte saída mostra processos / threads gerados usando clone syscall:

# SPAWNED PROCESSES/THREADS
$ grep 'clone(' rsync.log | awk '{print $1 " -> " $NF}'
1399 -> 1400
1400 -> 1401

A seguinte saída mostra que na maioria das vezes os dados foram write n para o descritor de arquivos com o número 4 :

# PID, FD, NO OF CALLING WRITE SYSCALL
$ cat <(grep 'write(' rsync.log | egrep -v 'unfinished|resumed') <(paste <(grep write rsync.log | grep unfinished) <(grep write rsync.log | grep resumed)) | cut -d',' -f1 | sed 's%write(%%' | awk '{a[$0]++}END{print "PID  FD COUNT"; for(i in a){print i " " a[i]}}'
PID  FD COUNT
1399  4 1622
1400  1 7
1401  3 307
1401  4 7
1399  1 15

A seguinte saída mostra que o descritor 4 nunca foi aberto usando open syscall (1 é STDOUT, portanto, não presumo de abrir este FD):

# LIST OF FILE DESCRIPTORS THAT WAS OPEN
$ grep 'open(' rsync.log | awk 'BEGIN {FS=" = "} {print $NF}' | grep '^[0-9]\+$' | sort | uniq
0
3
6

Duas perguntas:

eu. Se 4 descriptor não foi open ed onde esses dados vão, e como é possível que rsync funcionou como esperado?:

$ grep 'write(4' rsync.log | head
1399  write(4, "
$ strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/
# SPAWNED PROCESSES/THREADS
$ grep 'clone(' rsync.log | awk '{print $1 " -> " $NF}'
1399 -> 1400
1400 -> 1401
# PID, FD, NO OF CALLING WRITE SYSCALL
$ cat <(grep 'write(' rsync.log | egrep -v 'unfinished|resumed') <(paste <(grep write rsync.log | grep unfinished) <(grep write rsync.log | grep resumed)) | cut -d',' -f1 | sed 's%write(%%' | awk '{a[$0]++}END{print "PID  FD COUNT"; for(i in a){print i " " a[i]}}'
PID  FD COUNT
1399  4 1622
1400  1 7
1401  3 307
1401  4 7
1399  1 15
", 4 <unfinished ...> 1399 write(4, "I
# LIST OF FILE DESCRIPTORS THAT WAS OPEN
$ grep 'open(' rsync.log | awk 'BEGIN {FS=" = "} {print $NF}' | grep '^[0-9]\+$' | sort | uniq
0
3
6
$ grep 'write(4' rsync.log | head
1399  write(4, "%pre%%pre%%pre%", 4 <unfinished ...>
1399  write(4, "I%pre%%pre%(.%pre%%pre%%pre%W}%i00170A%pre%%pre%%pre%37vbox"..., 77 <unfinished ...>
1401  write(4, "%pre%%pre%6777", 8) = 8
1399  write(4, "71%pre%\n0%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%7746C4.%pre%0"..., 49539) = 49539
1399  write(4, "1%pre%77a3332m1065657206m3636;v"..., 49414) = 49414
1399  write(4, "2%pre%776mTNG646u74500*741W2075%0"..., 49685 <unfinished ...>
1399  write(4, "00%pre%77W7$\f,\v65166m36m36m36m36"..., 49396 <unfinished ...>
1399  write(4, "31%pre%77D4# D4xA\fY0U1Q*e53\v0~1"..., 49559 <unfinished ...>
1399  write(4, "00%pre%77l5cs.%pre%$406}c36m365<1m36m"..., 49404 <unfinished ...>
1399  write(4, "1%pre%7752Q304w3722Z5024g044507B"..., 49428) = 49428
(.%pre%%pre%%pre%W}%i00170A%pre%%pre%%pre%37vbox"..., 77 <unfinished ...> 1401 write(4, "%pre%%pre%6777", 8) = 8 1399 write(4, "71%pre%\n0%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%7746C4.%pre%0"..., 49539) = 49539 1399 write(4, "1%pre%77a3332m1065657206m3636;v"..., 49414) = 49414 1399 write(4, "2%pre%776mTNG646u74500*741W2075%0"..., 49685 <unfinished ...> 1399 write(4, "00%pre%77W7$\f,\v65166m36m36m36m36"..., 49396 <unfinished ...> 1399 write(4, "31%pre%77D4# D4xA\fY0U1Q*e53\v0~1"..., 49559 <unfinished ...> 1399 write(4, "00%pre%77l5cs.%pre%$406}c36m365<1m36m"..., 49404 <unfinished ...> 1399 write(4, "1%pre%7752Q304w3722Z5024g044507B"..., 49428) = 49428

II. Posso de alguma forma obter também dados (linhas correspondentes) que foram transferidos entre processos, por exemplo: de 1399 para 1400 ou de 1399 para 1401 etc. (se houver algum)?

Obrigado

    
por Wakan Tanka 22.06.2016 / 19:04

1 resposta

0

Os dados gravados em um descritor de arquivos que nunca foi aberto não vão a lugar nenhum. A chamada do sistema write falha com EBADF (descritor de arquivo incorreto).

Mas como meuh remarcado , open não é a única maneira de abrir um arquivo. Há também pipe para criar um par de extremidades de pipe, socketpair para criar um par de soquetes que conversam entre si, socket e accept para criar soquetes que conversam com um endereço remoto, etc. mencionar tipos de arquivos que você não pode write , como diretórios, inotify filas de eventos, etc.)

    
por 23.06.2016 / 02:10