Вы находитесь на странице: 1из 9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

AquitemosumlivrolivreecompletosobreShell
Ossedentosdo"saberlivre"somuitobenvindos.
ProcurecomandonoBotequim
[ 22 Jul 2012 - 03:34 ] Links Amigos BR-Linux Viva o Linux Dicas-L Aurelio Thobias TWIKI BSICO Pgina Inicial ltimas Alteraes ndice Procura Estatsticas de Uso Aviso de Atualizao Mapa do Site TWIKI AVANADO Registre-se Configuraes Gerais Quem Somos Regras de Formatao Biblioteca Grfica Carinhas Grficas PROJETO GRFICO Pr Tpico Ps Tpico Menu Lateral Menu de Navegao CSS Utilizado Botes Especiais Indica Onde Estamos Cabealho Padro Copy Right/Left Bl=(ptbl)oodnae od$tuod#Mdeefs Rv$tue)oodieees e=(ptrv#Mdevdorvro Nr=(ptsr)etuaatlopdaeal om$tug0#Rsareaaarodfut $cttmeas aatl.h #/i/ah !bnbs # #Clcocnratl,eieees, ooanetodeamvdorvro #aqatddeclnselna uniaedouaihs #qadaahatlhatrd. unootmnodeaeleao # taua28=snlgrdeamdnanaah rpMd8#2iaeaopluacotmno atluaeucoqefrso #deaeMdhafnauaais. - E a rapaz, tudo bom? - Bel, mas voc lembra que me pediu para fazer um programa que quando o tamanho de uma tela variasse, no seu centro apareceria dinamicamente, em vdeo reverso, a quantidade de linhas e colunas do jeito que o Linux faz normalmente? Pois eu fiz mas a aparncia no ficou igual. - No estou nem a para a aparncia, o que eu queria que voc exercitasse o que aprendemos. Deixe-me ver o que voc fez. Voc est aqui: TWikiBar > TWikiBarPapo011 Controles: - ltima Atualizao: [14 Feb 2012 - V.10]

PapodebotequimparteXI
Named Pipes Sincronizao de processos. Bloqueio de arquivos Substituio de processos

Md) ua( { cer la Cl=(ptcl) os$tuos Ln=(ptlns is$tuie) tuu($is/2)$(Cl)/2)#Cnratl ptcp$(Ln)((os7)etodea ehBl$e$osX$isNr co$odRvClLn$om }

cer la ranp"ueotmnodeaoellopremnr ed1Mdaahatlutceagaatria

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

1/9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

- Perfeito! Que se dane a aparncia, depois vou te ensinar uns macetes para melhor-la o que vale que o programa est funcionando e est bem enxuto. - Poxa, perdi o maior tempo tentando descobrir como aumentar o fonte ... - Deixe isso para l e hoje vamos ver umas coisas bastante interessantes e teis.

NamedPipes
Um outro tipo de pipe o n m d p p , que tambm chamado de F F . aeie IO
FF IO

um acrnimo de First In First Out que se refere propriedade

em que a ordem dos bytes entrando no pipe a mesma que a da sada. O name em n m d p p , na verdade, o nome de um arquivo. Os aeie arquivos tipo n m d p p s so exibidos pelo comando l como qualquer aeie s outro, com poucas diferenas, veja:

$llpp1 sie pwrr1jlodpo0Jn231ie| ruiiaa22:1pp1 O p na coluna mais esquerda indica que f f 1 um n m d p p . O resto io aeie dos bits de controle de permisses, quem pode ler ou gravar o pipe, funcionam como um arquivo normal. Nos sistemas mais modernos uma barra vertical (| colocado ao fim do nome do arquivo, outra dica, e ) nos sistemas LINUX, onde a opo de cor est habilitada, o nome do arquivo escrito em vermelho por default. Nos sistemas mais antigos, os n m d p p s so criados pelo programa aeie
mnd ko,

normalmente situado no diretrio / t . ec

Nos sistemas mais modernos, a mesma tarefa feita pelo m f f . O kio programa m f f recebe um ou mais nomes como argumento e cria pipes kio com estes nomes. Por exemplo, para criar um n m d p p com o nome aeie
pp1 ie,

faa:

$mffie kiopp1 Como sempre, a melhor forma de mostrar como algo funciona dando exemplos. Suponha que ns tenhamos criado o n m d p p mostrado aeie anteriormente. Vamos agora trabalhar com duas sesses ou duas consoles virtuais ou uma de cada. Em uma delas faa:

$ll>pp1 sie

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

2/9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

e em outra faa:

$ct<pp1 aie Voil! A sada do comando executado na primeira console foi exibida na segunda. Note que a ordem em que os comandos ocorreram no importa. Se voc prestou ateno, reparou que o primeiro comando executado, parecia ter "pendurado, congelado". Isto acontece porque a outra ponta do pipe ainda no estava conectada, e ento o sistema operacional suspendeu o primeiro processo at que o segundo "abrisse" o pipe. Para que um processo que usa pipe no fique em modo de wait, necessrio que em uma ponta do pipe tenha um processo "tagarela" e na outra um "ouvinte" e no exemplo que demos, o l era o "falador" e o c t era o s a "orelho". Uma aplicao muito til dos n m d p p s permitir que programas sem aeie nenhuma relao possam se comunicar entre si, os n m d p p s tambm aeie so usados para sincronizar processos, j que em um determinado ponto voc pode colocar um processo para "ouvir" ou para "falar" em um determinado n m d p p e ele da s sair, se outro processo "falar" ou aeie "ouvir" aquele pipe. Voc j viu que o uso desta ferramenta timo para sincronizar processos e para fazer bloqueio em arquivos de forma a evitar perda/corrupo de informaes devido a atualizaes simultneas (concorrncia). Vejamos exemplos para ilustrar estes casos.

Sincronizaodeprocessos.
Suponha que voc dispare paralelamente dois programas (processos) cujos diagramas de blocos de suas rotinas so como a figura a seguir:

Os dois processos so disparados em paralelo e no B O O do P o r m 1 LC1 rgaa as trs classificaes so disparadas da seguinte maneira:

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

3/9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

frAqiiFl1BgieiFl3 ornBgieiFl2Bgie d o isrAq fot$r te hn Mnav ad=a es le Mnapr ad=ae bek ra f i dn oe ehMna>pp1 co$adie [$adae]& Mna=pr& { ehrodrneacasfcodsaqio coEruatlsiiaoruvs ei xt1 } .. .

Assim sendo, o comando i testa cada classificao que est sendo f efetuada. Caso ocorra qualquer problema, as classificaes seguintes sero abortadas, uma mensagem contendo a cadeia p r enviada pelo ae
p p 1e p o r m 1 ie rgaa

descontinuado com um fim anormal.

Enquanto o P o r m 1 executava o seu primeiro bloco (as classificaes) rgaa o P o r m 2 executava o seu B O O , processando as suas rotinas de rgaa LC1 abertura e menu paralelamente ao P o r m 1 ganhando desta forma um rgaa, bom intervalo de tempo. O fragmento de cdigo do P o r m 2 a seguir, mostra a transio do seu rgaa
B O O para LC1

o BOO: LC2

O=ctpp1 K`aie` i[$K=v fOa] te hn .. . Rtneipeso oiadmrs .. . es#eeepr"eK leRcbu"aemO ei xt1 f i

Aps a execuo de seu primeiro bloco, o P o r m 2 passar a "ouvir" o rgaa


pp1 ie,

ficando parado at que as classificaes do P o r m 1 terminem, rgaa

testando a seguir a mensagem passada pelo p p 1 para decidir se os ie arquivos esto ntegros para serem impressos, ou se o programa dever ser descontinuado. Desta forma possvel disparar programas de forma assncrona e sincroniz-los quando necessrio, ganhando bastante tempo de processamento.

Bloqueiodearquivos
Suponha que voc escreveu uma CGI ( Common Gateway Interface) em Shell para contar quantos hits recebe uma determinada URL e a rotina de contagem est da seguinte maneira:
Ht=$ctpg.is2dvnl)|Ht= is"(aaeht>/e/ul"|is0 eh(Ht=is+)>pg.is co$(isHt+)aeht

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

4/9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

Desta forma se a pgina receber dois ou mais acessos concorrentes, um ou mais poder(o) ser perdido(s), basta que o segundo acesso seja feito aps a leitura da arquivo p g . i s e antes da sua gravao, isto aeht , basta que o segundo acesso seja feito aps o primeiro ter executado a primeira linha do script e antes de executar a segunda. Ento o que fazer? Para resolver o problema de concorrncia vamos utilizar um n m d p p . Criamos o seguinte script que ser o daemon que aeie receber todos os pedidos para incrementar o contador. Note que ele vai ser usado por qualquer pgina no nosso site que precise de um contador.

$ctcnaiss aotht.h #/i/ah !bnbs

PP=/m/iecnao"#aqionmdpp IE"tppp_otdrruvaeie #drodeaooaosaqiootdrsdaapgn inesroclcdsoruvscnaoeecdaia DR"vrwwcnao" I=/a/w/otdr [$IE|mff$IE p"PP"]|kio"PP"

wie: hl d o frULi(aPP) oRn$ct<$IE d o FL=$I/(co$Res./,) IE"DR$ehUL|sd',*,'" #OS:necm,cmrcsvrcrr B1osdaiaoopeiaapoua #uabrauaogloosprdr mar,smsvruacmeaao. #OS:qadoaoodeooetrxmih B2unordrcmamncmneapoialna ehaqio=$IE co"ruvFL" n"(aFL>/e/ul"|= =$ct$IE2dvnl)|n0 eh(nn1)>"FL" co$(=+)$IE dn oe dn oe

Como s este script altera os arquivos, no existe problema de concorrncia. Este script ser um daemon, isto , rodar em background. Quando uma pgina sofrer um acesso, ela escrever a sua URL no arquivo de pipe. Para testar, execute este comando:
ehtsepgn.tltppp_otdr co"et_aiahm">/m/iecnao

Para evitar erros, em cada pgina que quisermos adicionar o contador acrescentamos a seguinte linha:
<#xccd"co$EUS_Rtppp_otdr> !eem=ehRQETUI>/m/iecnao"

Note que a varivel $ E U S _ R contm o nome do arquivo que o RQETUI navegador (browser) requisitou. Este ltimo exemplo, fruto de uma idia que troquei com o amigo e

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

5/9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

mestre em Shell, Thobias Salazar Trevisan que escreveu o script e colocou-o em sua excelente URL. Aconselho a todos que querem aprender Shell a dar uma olhada nela (D uma olhada e inclua-a nos favoritos). Ahhh! Voc pensa que o assunto sobre n m d p p s est esgotado? aeie Enganou-se. Vou mostrar um uso diferente a partir de agora.

Substituiodeprocessos
Acabei de mostrar um monte de dicas sobre n m d p p s agora vou aeie, mostrar que o Shell tambm usa os n m d p p s de uma maneira bastante aeie singular, que a substituio de processos (process substitution). Uma substituio de processos ocorre quando voc pe um comando ou um pipeline de comandos entre parnteses e um < ou um > grudado na frente do parntese da esquerda. Por exemplo, teclando-se o comando:

$ct<ll a(s) Resultar no comando l l executado em um subshell como normal s (por estar entre parnteses), porm redirecionar a sada para um n m d ae
p p temporrio, ie

que o Shell cria, nomeia e depois remove. Ento o c t a

ter um nome de arquivo vlido para ler (que ser este n m d p p e cujo aeie dispositivo lgico associado / e / d 6 ), e teremos a mesma sada que dvf/3 a gerada pela listagem do l l porm dando um ou mais passos que o s, usual, isto , mais onerosa para o computador. Como poderemos constatar isso? Fcil... Veja o comando a seguir:

$ll>ct s(a) lwnvsjee4Ag222dvf/3ie[ x1jeenvs6u71:6/e/d6>pp:7

... Realmente um n m d p p . aeie Voc deve estar pensando que isto uma maluquice de nerd, n? Ento suponha que voc tenha 2 diretrios: d r e d r b p e deseja saber se os i i.k dois esto iguais (aquela velha dvida: ser que meu backup est atualizado?). Basta comparar os dados dos arquivos dos diretrios com o comando c p fazendo: m,

$cp<ctdr*(ai.k/)|cobcuuao m(ai/)<ctdrbp*|ehakpfrd

ou, melhor ainda:

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

6/9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

$cp<ctdr*(ai.k/)>dvnl|ehakpf m(ai/)<ctdrbp*/e/ul|cobcuu

Da forma acima, a comparao foi efetuada em todas as linhas de todos os arquivos de ambos os diretrios. Para acelerar o processo, poderamos compara somente a listagem longa de ambos os diretrios, pois qualquer modificao que um arquivo sofra, mostrada na data/hora de alterao e/ou no tamanho do arquivo. Veja como ficaria:

$cp<lldr(si.k)>dvnl|ehakpf m(si)<lldrbp/e/ul|cobcuu

Este um exemplo meramente didtico, mas so tantos os comandos que produzem mais de uma linha de sada, que serve como guia para outros. Eu quero gerar uma listagem dos meus arquivos, numerando-os e ao final dar o total de arquivos do diretrio corrente:
wierar hledaq d o (i+)#asmnoeeesroiiilzri (+)siahncsaincaia eh$:$r" co"iaq dn(s oe<<l) ehNieoiorne(pd)eitm$ruvs co"odrtrocret`w`xseiaqio"

T legal, eu sei que existem outras formas de executar a mesma tarefa. Usando o comando w i e a forma mais comum de resolver esse problema hl, seria:
lhledaq s|wierar d o (i+)#asmnoeeesroiiilzri (+)siahncsaincaia eh$:$r" co"iaq dn oe ehNieoiorne(pd)eitm$ruvs co"odrtrocret`w`xseiaqio"

Quando executasse o script, pareceria estar tudo certo, porm no comando e h aps o d n , voc ver que o valor de $ foi perdido. Isso co oe i deve-se ao fato desta varivel estar sendo incrementada em um subshell criado pelo pipe (| e que terminou no comando d n , levando com ele ) oe todas as variveis criadas no seu interior e as alteraes feitas em todas as variveis, inclusive as criadas externamente. Somente para te mostrar que uma varivel criada fora do subshell e alterada em seu interior perde as alteraes feitas ao seu final, execute o script a seguir:
#/i/ah !bnbs LS="raanhlrnia IT"#Cidoselpicpl lhledFLncodusel s|wieraIE#Iiiosbhl d o LS=$IE$ITleaadnrosbhl IT"FLLS"#Atrdetodusel dniosbhl oe#Fmdusel eh$IT co:LS:

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

7/9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

Ao final da execuo voc ver que aperecero apenas dois dois-pontos (: ). Mas no incio deste exemplo eu disse que era meramente didtico : porque existem formas melhores de fazer a mesma tarefa. Veja s estas duas:

$lan s|ct ou ento, usando a prpria substituio de processos:

$ct(s an<l) Um ltimo exemplo: voc deseja comparar a q e a q usando o comando r1 r2


cm, om

mas este comando necessita que os arquivos estejam

classificados. Ento a melhor forma de proceder :

$cm(otaq)<srr2 om<srr1(otaq) Esta forma evita que voc faa as seguintes operaes:

$srr1>/m/ot otaqtpsr1 $srr2>/m/ot otaqtpsr2 $cmtpsr1/m/ot om/m/ottpsr2 $rf/m/ottpsr2 mtpsr1/m/ot Pessoal, o nosso Papo de Botequim chegou ao fim . Curti muito aqui e

recebi diversos elogios pelo trabalho desenvolvido ao longo de doze meses e, o melhor de tudo, fiz muitas amizades e tomei muitos chopes de graa com os leitores que encontrei pelos congressos e palestras que ando fazendo pelo nosso querido Brasil. O que vou escrever aqui no est combinado nem sei se ser publicado, mas como os editores desta revista so dois malucos beleza (ambos Rafael), bem capaz de deixarem passar. o seguinte: se quiserem que o Papo de Botequim continue, entulhem a caixa postal da Linux Magazine pedindo por isso e desde j escolham o prximo tema entre s d + e
e p e s e e u a e ou xrssrglrs

linguagem a k w.

De qualquer forma, caso no consigamos sensibilizar a direo da revista, me despeo de todos mandando um grande abrao aos barbudos e beijos s meninas e agradecendo os mais de 100 e-mails que recebi (todos elogiosos) e todos devidamente respondidos. sade de todos ns: Tim, Tim. - Chico, fecha a minha conta porque vou mudar de botequim.

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

8/9

22/07/12

.:TWikiBarPapo011 > TWikiBar > Aqui temos um _livro livre_ e completo sobre _Shel

Vou aproveitar tambm para mandar o meu jab: diga para os amigos que quem estiver afim de fazer um curso porreta de programao em Shell que mande um e-mail para a nossa gerencia de treinamento para informar-se. Qualquer dvida ou falta de companhia para um chope ou at para falar mal dos polticos s mandar um e-mail para mim. Valeu!

(CC) 2012 Pelos Frequentadores do Bar do Jlio Neves. Todo o contedo desta pgina pode ser utilizado segundo os termos da Creative Commons License: Atribuio-UsoNoComercialPermannciaDaLicena.

wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011?skin=freeprint

9/9

Вам также может понравиться