<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CODARE &#187; Linux</title>
	<atom:link href="http://codare.net/category/sistemas/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://codare.net</link>
	<description>Programadores, uni-vos!</description>
	<lastBuildDate>Fri, 03 Dec 2010 21:34:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>C/C++: cannot open shared object file</title>
		<link>http://codare.net/2009/07/29/cc-cannot-open-shared-object-file/</link>
		<comments>http://codare.net/2009/07/29/cc-cannot-open-shared-object-file/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 12:00:40 +0000</pubDate>
		<dc:creator>Thiago Marcos Santos</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[CPP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[-rpath]]></category>
		<category><![CDATA[biblioteca]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[ld]]></category>
		<category><![CDATA[LD_LIBRARY_PATH]]></category>
		<category><![CDATA[linker]]></category>
		<category><![CDATA[shared libraries]]></category>

		<guid isPermaLink="false">http://codare.net/?p=481</guid>
		<description><![CDATA[As bibliotecas compartilhadas são carregadas no início da execução de um programa. No Linux, o dynamic loader procura pelas bibliotecas em /lib e /usr/lib. Caso a biblioteca não esteja presente neste caminho, recebemos uma mensagem de erro parecida com a &#8230; <a href="http://codare.net/2009/07/29/cc-cannot-open-shared-object-file/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>As bibliotecas compartilhadas são carregadas no início da execução de um programa. No Linux, o dynamic loader procura pelas bibliotecas em /lib e /usr/lib. Caso a biblioteca não esteja presente neste caminho, recebemos uma mensagem de erro parecida com a mensagem a seguir:</p>
<pre>error while loading shared libraries: libfoo.so:
  cannot open shared object file: No such file or directory</pre>
<p>Imagine um ambiente de desenvolvimento, onde estamos codificando uma biblioteca. Não queremos instalar esta biblioteca no sistema só para testá-la. Uma alternativa é configurar a variável de ambiente LD_LIBRARY_PATH, apontando para o diretório onde se encontra o binário da biblioteca. Assim o dynamic loader vai procurar pela biblioteca também neste diretório.</p>
<pre>$ export LD_LIBRARY_PATH=/home/user/libfoo/</pre>
<p>Uma segunda opção seria no momento em que seu programa é &#8220;linkado&#8221;, passar o caminho da biblioteca para a opção -rpath do linker. Isto coloca o caminho de busca pela biblioteca dentro da estrutura do executável (<a href="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF</a>). A opção -Wl do gcc serve para passar parâmetros para o linker (usando &#8220;,&#8221; no lugar de espaço) que é chamado automaticamente após a compilação.</p>
<pre>$ gcc -shared -Wall -o libfoo.so foo.c</pre>
<pre>$ gcc -Wall -o test test.c -L/home/user/libfoo/ -lfoo</pre>
<pre>$ ./test <strong># Erro! Não acha a biblioteca libfoo.so</strong></pre>
<pre>$ gcc -Wall -Wl,-rpath,/home/user/libfoo/ -o test test.c \
  -L/home/user/libfoo/ -lfoo</pre>
<pre>$ ./test <strong># Funciona!</strong></pre>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/07/29/cc-cannot-open-shared-object-file/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>C: Descobrir se um processo está em execução</title>
		<link>http://codare.net/2009/05/27/c-descobrir-se-um-processo-esta-em-execucao/</link>
		<comments>http://codare.net/2009/05/27/c-descobrir-se-um-processo-esta-em-execucao/#comments</comments>
		<pubDate>Wed, 27 May 2009 12:00:03 +0000</pubDate>
		<dc:creator>Thiago Marcos Santos</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[execução]]></category>
		<category><![CDATA[kill]]></category>
		<category><![CDATA[pid]]></category>
		<category><![CDATA[posix]]></category>
		<category><![CDATA[processo]]></category>

		<guid isPermaLink="false">http://codare.net/?p=383</guid>
		<description><![CDATA[No Linux é muito comum um daemon, durante sua execução, criar um arquivo .pid dentro de /var/run. Dentro do arquivo syslogd.pid, por exemplo, contém o PID da instância do syslogd em execução. Usa-se este mecanismo para impedir que duas instâncias &#8230; <a href="http://codare.net/2009/05/27/c-descobrir-se-um-processo-esta-em-execucao/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>No Linux é muito comum um daemon, durante sua execução, criar um arquivo .pid dentro de /var/run. Dentro do arquivo syslogd.pid, por exemplo, contém o PID da instância do syslogd em execução. Usa-se este mecanismo para impedir que duas instâncias do mesmo processo rodem simultaneamente e conflitem na obtenção de recursos.</p>
<p>Porém, a simples existência do arquivo .pid não garante que o processo esteja em execução. Ele pode ter sido fechado de uma forma inesperada e não o apagou. Então, temos que ler o conteúdo do arquivo .pid e certificar que o processo com aquele número de PID está em execução.</p>
<p>A forma mais fácil de fazer isso é enviando o sinal 0 para o processo. O sinal 0 é especial e não é de fato enviado, caso contrário o processo destinatário poderia ser fechado se não tratasse o sinal, mas o retorno da função indica se um sinal real seria enviado com sucesso. O código a seguir exemplifica como aplicar a técnica em C:</p>
<pre>int main(int argc, char **argv)
{
    unsigned int pid;

    if (argc != 2) {
        printf("Uso: %s PID\n", argv[0]);
        return 1;
    }

    pid = (unsigned int) atoi(argv[1]);

    if (!kill(pid, 0))
        printf("%d esta em execucao.\n", pid);
    else
        printf("%d nao esta em execucao.\n", pid);

    return 0;
}</pre>
<p>A mesma técnica pode ser aplicada no terminal:</p>
<pre>$ kill -0 123
$ echo $? # Imprime 0 se o PID 123 existir, 1 caso contrario</pre>
<p>Note que você precisa ter permissão para enviar um sinal para um determinado processo. Para um usuário sem privilégios especiais, a dica só vai funcionar para verificar a existência de processos iniciados pelo próprio usuário.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/05/27/c-descobrir-se-um-processo-esta-em-execucao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Shell: Obter o IP da interface de rede</title>
		<link>http://codare.net/2009/04/29/shell-obter-o-ip-da-interface-de-rede/</link>
		<comments>http://codare.net/2009/04/29/shell-obter-o-ip-da-interface-de-rede/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 12:00:56 +0000</pubDate>
		<dc:creator>Fabiano Pires</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[ifconfig]]></category>
		<category><![CDATA[IP]]></category>

		<guid isPermaLink="false">http://codare.net/?p=314</guid>
		<description><![CDATA[(LANG=C; ifconfig eth0&#124;grep "inet addr"&#124;cut -f2 -d:&#124;cut -f1 -d" ") Para pegar o endereço de uma interface diferente basta colocar o nome dessa interface no lugar de eth0. É interessante que o comando seja colocado entre parênteses, para não modificar o &#8230; <a href="http://codare.net/2009/04/29/shell-obter-o-ip-da-interface-de-rede/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<pre>(LANG=C; ifconfig eth0|grep "inet addr"|cut -f2 -d:|cut -f1 -d" ")</pre>
<p>Para pegar o endereço de uma interface diferente basta colocar o nome dessa interface no lugar de <strong>eth0</strong>.</p>
<p>É interessante que o comando seja colocado entre parênteses, para não modificar o valor da variável de ambiente LANG da sua sessão de shell atual (que controla o idioma em que os aplicativos são exibidos).</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/04/29/shell-obter-o-ip-da-interface-de-rede/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Shell: Descobrir seu IP na internet</title>
		<link>http://codare.net/2009/04/17/shell-descobrir-seu-ip-na-internet/</link>
		<comments>http://codare.net/2009/04/17/shell-descobrir-seu-ip-na-internet/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 12:00:17 +0000</pubDate>
		<dc:creator>Fabiano Pires</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[links2]]></category>
		<category><![CDATA[lynx]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[wget]]></category>

		<guid isPermaLink="false">http://codare.net/?p=285</guid>
		<description><![CDATA[Algumas vezes uma máquina está conectada à internet de forma indireta, através de um proxy ou mesmo um firewall com múltiplos links de internet. Os comandos seguintes permitem descobrir qual IP a máquina está utilizando na internet. Utilizando o wget: &#8230; <a href="http://codare.net/2009/04/17/shell-descobrir-seu-ip-na-internet/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes uma máquina está conectada à internet de forma indireta, através de um proxy ou mesmo um firewall com múltiplos links de internet. Os comandos seguintes permitem descobrir qual IP a máquina está utilizando na internet.</p>
<p><strong>Utilizando o wget:</strong></p>
<pre>echo $(wget -qO- http://www.whatismyip.com/automation/n09230945.asp)</pre>
<p><strong>Utilizando o lynx (ou o links2):</strong></p>
<pre>lynx -dump http://www.whatismyip.com/automation/n09230945.asp</pre>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/04/17/shell-descobrir-seu-ip-na-internet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Limpar caches de disco e de filesystem no Linux</title>
		<link>http://codare.net/2006/12/04/limpar-caches-de-disco-e-de-filesystem-no-linux/</link>
		<comments>http://codare.net/2006/12/04/limpar-caches-de-disco-e-de-filesystem-no-linux/#comments</comments>
		<pubDate>Mon, 04 Dec 2006 20:44:22 +0000</pubDate>
		<dc:creator>Eduardo Habkost</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://codare.wordpress.com/2006/12/04/limpar-caches-de-disco-e-de-filesystem-no-linux/</guid>
		<description><![CDATA[Palavras-chave: linux, cache, buffers, limpeza, memória, carregamento, disco, filesystem O Linux mantém em memória os dados recentemente carregados do disco, e ali eles ficam enquanto possível. Isso acelera o processo de carregamento destes mesmos dados no futuro, como na execução &#8230; <a href="http://codare.net/2006/12/04/limpar-caches-de-disco-e-de-filesystem-no-linux/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: linux, cache, buffers, limpeza, memória, carregamento, disco, filesystem</p>
<p>O Linux mantém em memória os dados recentemente carregados do disco, e ali eles ficam enquanto possível. Isso acelera o processo de carregamento destes mesmos dados no futuro, como na execução de programas e leitura de arquivos.</p>
<p>As áreas na memória que carregam esses dados chamam-se <em>caches</em>. Você pode notar os caches em ação quando roda um programa pela segunda vez e ele carrega muito mais rapidamente que na primeira.</p>
<p>Mas às vezes é necessário fazer algum teste onde esse efeito de cache deve ser anulado, por exemplo, medir tempo de carregamento de um programa, ou o tempo necessário para processar algum arquivo. Já vi gente reiniciando a máquina só para poder ter uma medição confiável no tempo de carregamento de um programa.</p>
<p>Para economizar nosso tempo e paciência, e ter um efeito semelhante sem precisar reiniciar a máquina, podemos pedir ao kernel que limpe todos os caches que estiverem em memória. Basta usar uma entrada no <code>/proc</code>, existente nas versões mais recentes do kernel, rodando o comando:</p>
<pre>
echo 1 &gt; /proc/sys/vm/drop_caches
</pre>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2006/12/04/limpar-caches-de-disco-e-de-filesystem-no-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>C: Segmentation fault em programas OpenGL com multi-threading</title>
		<link>http://codare.net/2006/09/21/c-segmentation-fault-em-programas-opengl-com-multi-threading/</link>
		<comments>http://codare.net/2006/09/21/c-segmentation-fault-em-programas-opengl-com-multi-threading/#comments</comments>
		<pubDate>Thu, 21 Sep 2006 04:57:28 +0000</pubDate>
		<dc:creator>Alfredo Kojima</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://codare.wordpress.com/2006/09/21/segmentation-fault-em-programas-opengl-com-multi-threading/</guid>
		<description><![CDATA[Palavras-chave: OpenGL, Linux, multi-thread, drivers NVidia, crash, segmentation fault, segfault Se seu programa explode em uma função OpenGL sem nenhum motivo aparente, verifique se a chamada está sendo feita desde a thread onde a OpenGL foi inicializada. As bibliotecas que &#8230; <a href="http://codare.net/2006/09/21/c-segmentation-fault-em-programas-opengl-com-multi-threading/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: OpenGL, Linux, multi-thread, drivers NVidia, crash, segmentation fault, segfault</p>
<p>Se seu programa explode em uma função OpenGL sem nenhum motivo aparente, verifique se a chamada está sendo feita desde a thread onde a OpenGL foi inicializada.</p>
<p>As bibliotecas que vêm com os drivers da NVidia (libGL.so) para X não são muito tolerantes com programas com multi-threading, enquanto a libGL.so da Mesa parece ser mais tolerante a isso. Isso pode levar à confusa situação de o programa rodar sem problemas em alguns sistemas e morrer em outros.</p>
<p>Nos casos em que tive esse problema, o segfault ocorreu na função <code>glViewport()</code>, mas é provável que ocorra com outras funções.</p>
<p>Não existe solucão mágica, mas um workaround &#8212; para ao menos testar a hipótese &#8212; é mudar o LD_LIBRARY_PATH para apontar ao libGL.so da xorg (se não a tem instalado, tente copiar de outro lugar etc). Verifique se a biblioteca correta está sendo usada com ldd e teste. Já a solucão definitiva é mover as chamadas OpenGL que acessam o mesmo contexto para uma única thread (ou protegê-las com mutexes).</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2006/09/21/c-segmentation-fault-em-programas-opengl-com-multi-threading/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

