Академический Документы
Профессиональный Документы
Культура Документы
.: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 }
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
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,
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
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
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.
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
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:
... 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
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:
$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