File descriptor in Linux cum exemplis

Quondam in colloquio, interrogatus sum, quid facies si officium non invenias operandi ex eo quod orbis ex spatio excurrit?

Sane respondi me videre quid hoc loco teneretur et, si fieri posset, locum purgarem.
Tum Interviewer quaesivit, quid si spatium vacuum in partitione non est, sed etiam tu non vides aliquas tabellas quae totum spatium capiant?

Ad haec dixi te semper videre posse descriptores tabellam apertam, exempli gratia cum praecepto lsof, et intelligere quam applicationem omnia spatium opportunum sumpserit, et tum secundum circumstantias agere potes, prout opus est. .

Interviewer me in verbo ultimo interpellavit, interrogationi eius addens: "Puta nos non egere notitia, iustus est index debug, sed applicatio non operatur quia lusione scribere non potest"?

"Bene," inquam, "debug possumus in applicatione config et sileo eam averte."
Interviewer obiecit: "Immo applicationem sileo non possumus, adhuc habemus notitias magnas in memoria repositas, et clientes magni ad ipsum servitium pertinentes, quod denuo reconnect compellere non possumus".

"Bene," inquam, "si applicationes silere non possumus et notitias nobis non magni momenti esse, tunc simpliciter hunc fasciculum apertum per tabellam descriptorem purgare possumus, etsi in mandato eius non videmus in tabella ratio ".

Interviewer placuit, sed non eram.

Tunc cogitabam, cur non altius fodit homo scientiam meam temptans? Sed quid si notitia momenti est? Quid si processum sileo non possumus, et processus scribit ad systema tabellae in partitione quae spatium liberum non habet? Quid, si non solum notitias quae iam scriptae sunt amittere non possumus, sed etiam notitias quas hic processus scribit vel conatur scribere?

Tuzik

Diluculo in vita mea, parvam applicationem creare conatus sum quae opus erat ad informationem usoris reponendas. Et tunc cogitabam quomodo usori suo datae respondere possum. Exempli gratia, Ivanov Ivan Ivanovich habeo, et aliquid habet, sed quomodo cum illis amicos facere possum? Immediate demonstrare possum canem nominatum "Tuzik" ad ipsum Ivan pertinere. Sed quid si nomen mutat et pro Ivan fit, verbi gratia, Olya? Tunc evenit ut nostra Olya Ivanovna Ivanova canem iam non habebit, et nostra Tuzik adhuc ad Ivan non exsistentem pertinebit. database quod unicuique usor singularem identifier (ID) solvendum adiuvit hanc quaestionem dedit, et meus Tuzik huic ID ligatus est, qui re vera numerus serialis erat. Ita dominus ace dominus ID numerus 2 habebat, et in aliquo puncto temporis Ivan sub hoc ID erat, et tunc Olya sub eodem ID factus est. Solvitur fere quaestio de agricultura et humanitate et pecuaria.

Tabularii descriptor

Problema tabellae et progressio, quae cum hoc fasciculo operatur, eadem fere est ac canis et hominis nostri. Pone limam, quam ivan.txt aperui, et verbum tuzik in eam scribere coepi, sed solum primam litteram "t" in tabella scribere curavi, et hic fasciculus ab aliquo nominatus est, exempli gratia, ad olya.txt. Sed tabella eadem manet, et in ea ace- tionem meam commemorare volo. Quoties lima ratio vocationis aperitur apertus in quavis lingua programmandi id singulare accipio quod me ad limam demonstrat, haec ID est tabella descriptorem. Et nihil refert quid et qui cum hac tabula sequenti, deleri potest, nominari potest, dominus mutari potest, vel iura legere et scribere tolli possunt, ego tamen accessum habeo. ei, quia tempore tabellae aperiendae, iura habui legere et/vel scribere et potui incipere opus cum eo, quod modo facere debeo.

In Linux, bibliotheca libc 3 descriptorum tabellas ad singulas applicationes currentes (processus), numeratos 0,1,2 aperit. Plura inveniri possunt in nexus homo stdio ΠΈ homo stdout

  • Tabella descriptor 0 vocatur STDIN et coniungitur cum applicatione initus
  • Tabularii descriptor 1 vocatur STDOUT et adhibetur applicationibus ad output data, ut mandata print
  • Tabularii descriptor 2 STDERR appellatur et adhibitis applicationibus ad nuntios erroris output adhibetur.

Si in programmate tuo limam aliquam legendi vel scribendi aperies, maxime probabile primum ID liberum habebis et numerus III.

Index descriptorum documenti ad quemlibet processum spectari potest, si eius PID scis.

Exempli causa, vercundus console aperiamus et processus nostri PID aspiciamus

[user@localhost ]$ echo $$
15771

In secundo console curramus

[user@localhost ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user  0 Oct  7 15:42 .
dr-xr-xr-x 9 user user  0 Oct  7 15:42 ..
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21

Fasciculi descriptori numero 255 ad fines huius articuli tuto ignorare potes, eius necessitatibus per se, non a bibliotheca coniunctum apertum est.

Nunc omnes III descriptor lima associatur pseudo termino machinam /dev/ptssed adhuc eos moliri possumus, exempli gratia, eos secundo consola- turos

[user@localhost ]$ echo "hello world" > /proc/15771/fd/0

Et in primo consolatorio videbimus

[user@localhost ]$ hello world

Redirect and Pipe

Facile has 3 descriptores fasciculos in quolibet processu superari potes, incluso in vercundus, exempli gratia per fistulam duobus processibus connectentibus, vide.

[user@localhost ]$ cat /dev/zero | sleep 10000

Hoc mandatum te ipsum currere potes strace -f * et vide quid intus agatur, sed breviter dicam.

Nostra parens processus bash cum PID 15771 parses mandatum nostrum et exacte intelligit quot praecepta quae volumus currere, in casu nostro duo sunt eorum: cattus et somnus. Bash scit quod duos infantes processus creare debet, eosque in unam fistulam confundere. In summa, bash opus erit 2 processibus puer et una fistula.

Bash decurrit ratio vocationis ante partum puer processibus pipe et novum fasciculum descriptores in quiddam fistulae temporariae accipit, sed hoc quiddam nondum duos processus pueriles coniungit.

Processus enim parentis, iam similis tibia est, sed non sunt pueri adhuc processus;

PID    command
15771  bash
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21

Tum per systema vocationis cDNA clone: Pagina duos processus infantis creat, et tres nostri processus sic habebunt;

PID    command
15771  bash
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21
PID    command
9004  bash
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 255 -> /dev/pts/21
PID    command
9005  bash
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 255 -> /dev/pts/21

Noli oblivisci quod clones processus cum omnibus descriptoribus fasciculi, ita iidem erunt in processu parentis et in infantibus. Officium processus parentis cum PID 15771 est processus prolis monitorem, ergo simpliciter responsum a filiis expectat.

Ergo fistula non eget, et fasciculus descriptorum numero III et IV claudit.

In puero primo processu vercundus cum PID 9004, ratio vocationis dup2, nostrum STDOUT fasciculi descriptor numerum 1 ad limam descriptor tibiam demonstrans, in casu nostro numerus est 3. Quapropter omnia quae primus puer processum cum PID 9004 scribit ad STDOUT sponte in tibia quiddam finiet.

In secundo processu infantis cum PID 9005, bash dup2 utitur ut tabellam descriptorem STDIN numerum mutet 0. Nunc omnia, quae secundus noster vercundus cum PID 9005 leget, e fistula leget.

Post hoc, fasciculi descriptores 3 et 4 numerati etiam in processibus infantum clauduntur, cum iam non sint usus.

Consulto praetermittendum documentum descriptorem 255, ad usus internos ab ipso vere et etiam in processibus infantum claudendis.

Deinde, in processu primo infantis cum PID 9004, bash incipit vocationis systematis utens exec fasciculus exsecutabilis quem designavimus in linea mandatorum, in casu nostro est /usr/bin/cat.

In secundo processu infantis cum PID 9005, vercundus currit alterum exsecutabile quod designavimus, in casu nostro /usr/bin/somnium.

Systema exec vocatio non comminus ansas fasciculi nisi cum vexillum O_CLOEXEC apertae sunt tempore vocatio aperta facta. In nostro casu, deductis documentis exsecutabilibus, omnes descriptores tabellae currentes salvabuntur.

Reprehendo in console:

[user@localhost ]$ pgrep -P 15771
9004
9005
[user@localhost ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user  0 Oct  7 15:42 .
dr-xr-xr-x 9 user user  0 Oct  7 15:42 ..
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21
[user@localhost ]$ ls -lah /proc/9004/fd
total 0
dr-x------ 2 user user  0 Oct  7 15:57 .
dr-xr-xr-x 9 user user  0 Oct  7 15:57 ..
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
l-wx------ 1 user user 64 Oct  7 15:57 1 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lr-x------ 1 user user 64 Oct  7 15:57 3 -> /dev/zero
[user@localhost ]$ ls -lah /proc/9005/fd
total 0
dr-x------ 2 user user  0 Oct  7 15:57 .
dr-xr-xr-x 9 user user  0 Oct  7 15:57 ..
lr-x------ 1 user user 64 Oct  7 15:57 0 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
[user@localhost ]$ ps -up 9004
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user  9004  0.0  0.0 107972   620 pts/21   S+   15:57   0:00 cat /dev/zero
[user@localhost ]$ ps -up 9005
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user  9005  0.0  0.0 107952   360 pts/21   S+   15:57   0:00 sleep 10000

Ut vides, in utroque processu idem est unicus numerus fistulae nostrae. Sic connexionem habemus inter duos processus diversos cum eodem parente.

Illis qui non sunt nota cum ratio vocat quod verecundus usus, tractet currit mandata per strate et videns ea quae interius fiunt, exempli gratia sic:

strace -s 1024 -f bash -c "ls | grep hello"

Redeamus ad problema orbis tractus humilibus et quaerit notitias servare sine processu restarting. Parva programmata scribamus quae circiter 1 megabyte per alterum ad orbem scribet. Praeterea, si notitias orbis scribere non potuimus, hoc simpliciter dissimulabimus et iterum secundo notitias scribere temptabimus. In exemplo, quo Pythone utor, alia programmandi lingua uti potes.

[user@localhost ]$ cat openforwrite.py 
import datetime
import time

mystr="a"*1024*1024+"n"
with open("123.txt", "w") as f:
    while True:
        try:
            f.write(str(datetime.datetime.now()))
            f.write(mystr)
            f.flush()
            time.sleep(1)
        except:
            pass

Progressio curramus et inspiciamus tabellam descriptores

[user@localhost ]$ python openforwrite.py &
[1] 3762
[user@localhost ]$ ps axuf | grep [o]penforwrite
user  3762  0.0  0.0 128600  5744 pts/22   S+   16:28   0:00  |   _ python openforwrite.py
[user@localhost ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user  0 Oct  7 16:29 .
dr-xr-xr-x 9 user user  0 Oct  7 16:29 ..
lrwx------ 1 user user 64 Oct  7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  7 16:29 3 -> /home/user/123.txt

Ut videre potes, descriptores fasciculi nostri III signatores habemus et unum magis quod aperuimus. Sit scriptor reprehendo lima amplitudo:

[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 117M Oct  7 16:30 123.txt

Notitia inscripta est, permissiones in tabella mutare conamur;

[user@localhost ]$ sudo chown root: 123.txt
[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 root root 168M Oct  7 16:31 123.txt
[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 root root 172M Oct  7 16:31 123.txt

Notitiam adhuc scribendam esse videmus, cum user noster tabellam scribendam non habet. Conemur auferre;

[user@localhost ]$ sudo rm 123.txt 
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory

Ubi est notitia scripta? et omnino scripta sunt? Reprehendimus:

[user@localhost ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user  0 Oct  7 16:29 .
dr-xr-xr-x 9 user user  0 Oct  7 16:29 ..
lrwx------ 1 user user 64 Oct  7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  7 16:29 3 -> /home/user/123.txt (deleted)

Ita, fasciculus noster descriptor adhuc exstat et hunc fasciculum descriptorem tractare possumus, sicut vetus fasciculus noster, legere, perspicere et imitari possumus.

Intueamur tabella amplitudo:

[user@localhost ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5   19923457   2621522 /home/user/123.txt

Tabella amplitudo est 19923457. Scrutare tabellam purgare:

[user@localhost ]$ truncate -s 0 /proc/31083/fd/3
[user@localhost ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5  136318390   2621522 /home/user/123.txt

Ut videre potes, magnitudo tabella tantum augetur et corpus nostrum non laboravit. Intueamur ratio vocationem documentorum apertus. Si vexillum O_APPEND aperiens tabella utimur, tum cum singulis scribe, ratio operativa coercet magnitudinem tabellae et notitias scribens ad extremum tabellae scribens, et hoc atomice facit. Hoc permittit plures stamina vel processus eadem tabella scribere. Sed in nostro codice hoc vexillo non utimur. In lsof post truncum videre possumus aliam magnitudinem fasciculi in lsof tantum si tabellam scripturae additionalis aperimus, quae in nostro codice loco significat.

with open("123.txt", "w") as f:

debemus ponere

with open("123.txt", "a") as f:

Reprehendo cum "w" vexillum

[user@localhost ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3

ac "a" vexillum

[user@localhost ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3

Programming iam currit processus

Saepe programmatores, cum programmata creandi et experiendi, debuggers (exempli gratia GDB) vel varios gradus colligationis in applicatione adhibent. Linux facultatem praebet scribendi et mutandi rationem iam currentem, exempli gratia, variabilium valores mutare, punctum interrumpere, etc., etc.

Rediens ad quaestionem originalem de spatio orbis non satis scribendo limam, problema simulare conetur.

Faciamus fasciculum partitionis nostrae, quam in orbem separatum conscendemus:

[user@localhost ~]$ dd if=/dev/zero of=~/tempfile_for_article.dd bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00525929 s, 2.0 GB/s
[user@localhost ~]$

Faciamus lima ratio:

[user@localhost ~]$ mkfs.ext4 ~/tempfile_for_article.dd
mke2fs 1.42.9 (28-Dec-2013)
/home/user/tempfile_for_article.dd is not a block special device.
Proceed anyway? (y,n) y
...
Writing superblocks and filesystem accounting information: done
[user@localhost ~]$

Conscende tabella ratio:

[user@localhost ~]$ sudo mount ~/tempfile_for_article.dd /mnt/
[sudo] password for user: 
[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  172K  7.9M   3% /mnt

Facimus directorium cum possessore nostro:

[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs

Aperiamus tabellam scribendo solum in programmate nostro:

with open("/mnt/logs/123.txt", "w") as f:

Launch

[user@localhost ]$ python openforwrite.py 

Expectamus brevi tempore

[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

Habemus igitur problema in principio huius articuli descriptum. Spatium liberum 0, 100% occupavit.

Meminimus secundum condiciones negotii, notitias maximas referre conamur quae amitti non possunt. Eodemque tempore opus est ut ministerium defigamus sine processu restarting.

Dicamus nos adhuc habere spatium orbis, sed in alia partitione, exempli gratia in /domo.

Experiamur ut "reprogramma in musca" codice nostro.

Intueamur PID processus nostri, qui totum orbis tractus consumpserit:

[user@localhost ~]$ ps axuf | grep [o]penfor
user 10078 27.2  0.0 128600  5744 pts/22   R+   11:06   0:02  |   _ python openforwrite.py

Coniungere ad processum per gdb

[user@localhost ~]$ gdb -p 10078
...
(gdb) 

Intueamur apertum documentorum descriptores:

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /mnt/logs/123.txt

Informationes de tabella descriptorum numero III spectamus, quae nobis consulit

(gdb) shell cat /proc/10078/fdinfo/3
pos:    8189952
flags:  0100001
mnt_id: 482

Animo habito quid systema Python vocet (vide supra ubi percurrimus et apertum invenimus vocationem), cum codicem nostrum expediendo ad limam aperiendam, eadem nos facimus pro processu nostro, sed O_WRONLY|O_CREAT| O_TRUNC frena cum valore numerorum repone. Hoc facere, fontes nucleos aperi, e.g hic et vide in quo vexilla sunt responsible pro quid

#definire O_WRONLY I
#define O_CREAT 00000100
#define O_TRUNC 00001000

Omnes valores in unum coniungimus, "00001101"

Currimus vocationis nostrae a gdb

(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4

Ita novum fasciculum descriptor cum numero 4 et novam tabulam apertam in alia partitione cepimus, coarguimus:

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct  8 11:15 4 -> /home/user/123.txt

Exemplum meminimus cum tibia - quam vercundus mutationes tabellarum descriptores, et iam rationem dup2 vocationis didicimus.

Conamur reponere file descriptor ad alterum

(gdb) call dup2(4,3)
$2 = 3

reprehendo:

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /home/user/123.txt
l-wx------ 1 user user 64 Oct  8 11:15 4 -> /home/user/123.txt

Descriptor tabellam claudimus 4, quia ea non egemus:

(gdb) call close (4)
$1 = 0

Et exitus gdb

(gdb) quit
A debugging session is active.

    Inferior 1 [process 10078] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 10078

Reprehendo novus lima:

[user@localhost ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 5.1M Oct  8 11:18 /home/user/123.txt
[user@localhost ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 7.1M Oct  8 11:18 /home/user/123.txt

Ut videre potes, notitia tabella novo scripta est, veterem reprehendo;

[user@localhost ~]$ ls -lah /mnt/logs/123.txt 
-rw-rw-r-- 1 user user 7.9M Oct  8 11:08 /mnt/logs/123.txt

Nulla notitia amittitur, applicatio opera, tigna ad novum locum scripta sunt.

Sit scriptor parum negotium inpediunt

Putamus notitias magnas nobis esse, sed in quibusvis partitionibus spatium orbis non habemus et orbis coniungere non possumus.

Quod facere possumus, notitia nostra alicubi est redirectio, exempli gratia ad tibiam, et vicissim notitia redirecta a fistula ad retem per programmata quaedam, exempli gratia netcat.
Nominatam tibiam cum imperio mkfifo creare possumus. Pseudo fasciculum creabit in systematis tabellae etiamsi spatium liberum in ea non est.

Applicationem sileo et vide:

[user@localhost ]$ python openforwrite.py 
[user@localhost ~]$ ps axuf | grep [o]pen
user  5946 72.9  0.0 128600  5744 pts/22   R+   11:27   0:20  |   _ python openforwrite.py
[user@localhost ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt
[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

Non est orbis tractus, sed feliciter nominatam fistulam ibi creamus;

[user@localhost ~]$ mkfifo /mnt/logs/megapipe
[user@localhost ~]$ ls -lah /mnt/logs/megapipe 
prw-rw-r-- 1 user user 0 Oct  8 11:28 /mnt/logs/megapipe

Nunc necesse est aliquo modo involvere omnes notas quae in hanc fistulam alii servo per retiaculum intrant, eadem reticula huic apta sunt.

In calculonis servi remotis-server.example.com deducimus

[user@localhost ~]$ nc -l 7777 > 123.txt 

De servo problematico nostro in terminali separato deducimus

[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe 

Nunc omnia notitia quae in fistula desinens statim ad stdin in netcat ibit, quae eam ad retiaculum in portum 7777 mittet.

Omnia facienda sunt, notitias nostras in hanc fistulam nominatam scribere incipimus.

Iam habemus applicationes cursus:

[user@localhost ~]$ ps axuf | grep [o]pen
user  5946 99.8  0.0 128600  5744 pts/22   R+   11:27 169:27  |   _ python openforwrite.py
[user@localhost ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt

Ex omnibus flagellis O_WRONLY tantum opus est quia tabella iam exstat et eam purgare non oportet.

[user@localhost ~]$ gdb -p 5946
...
(gdb) call open("/mnt/logs/megapipe", 00000001,0666)
$1 = 4
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct  8 14:20 4 -> /mnt/logs/megapipe
(gdb) call dup2(4,3)
$2 = 3
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/megapipe
l-wx------ 1 user user 64 Oct  8 14:20 4 -> /mnt/logs/megapipe
(gdb) call close(4)
$3 = 0
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/megapipe
(gdb) quit
A debugging session is active.

    Inferior 1 [process 5946] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 5946

Reperiens remota servo remote-server.example.com

[user@localhost ~]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 38M Oct  8 14:21 123.txt

Data venit, problema reprimimus server

[user@localhost ~]$ ls -lah /mnt/logs/
total 7.9M
drwxr-xr-x 2 user user 1.0K Oct  8 11:28 .
drwxr-xr-x 4 root     root     1.0K Oct  8 10:55 ..
-rw-rw-r-- 1 user user 7.9M Oct  8 14:17 123.txt
prw-rw-r-- 1 user user    0 Oct  8 14:22 megapipe

Notitia servata est, quaestio solvitur.

Hanc occasionem sumo a Degiro collegas meos salve dicere.
Audi radio-T podcasts.

Omnia bona est.

Ut congue sem, admoneo te cogitare quid erit in processu tabellariorum descriptores cat et dormies si hoc mandatum curris:

[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000

Source: www.habr.com