C/C++ Dicas Sem categoria
Como verificar user no Linux com C

A linguagem C é uma linguagem dinâmica, ainda mais com Linux, que foi feito nesta linguagem.

Iremos começar a navegar nas interações da linguagem C com o linux.

Nesta nossa primeira jornada, iremos explorar como descobrir o usuário conectado.

Ao criarmos um usuário, o linux registra este na pasta /etc/, mais especificamente no passwd.

Exemplo do arquivo passwd

No exemplo a cima, podemos ver que o usuario mmm, tem a representação, conforme apresentado abaixo:

mmm:x:1000:1000:mmm,,,:/home/mmm:/bin/bash

Se olharmos a estrutura deste podemos identificar, a seguinte ordem:

user:x:1001:1001:user,,,:/home/user:/bin/bash
[–] – [–] [–] [—–] [——–] [——–]
| | | | | | |
| | | | | | +-> 7. Login shell
| | | | | +———-> 6. Home directory
| | | | +——————–> 5. GECOS
| | | +————————–> 4. GID
| | +——————————-> 3. UID
| +———————————–> 2. Password
+—————————————-> 1. Username

estrutura do arquivo passwd

Os principais componentes deste fragmento, são o UID e o GID.

O UID é o User Identification – Que é um número único, que identifica o usuário

O GID é o Group Identification – Que identifica o grupo pertencente aquele usuário, este arquivo, esta associado ao arquivo /etc/groups, que auxilia na criação de permissões.

Lendo o UID e o GID do usuário conectado

Quando voce loga no linux, utiliza as suas credenciais, login e senha. Desta forma sua aplicação precisa saber como pegar tal informação.

As informações do usuário logado, podem ser obtidas através da biblioteca unistd.h, entre suas várias funções estão duas:

  • gid_t getgid(void)
  • gid_t getegid(void)

Abaixo, traremos o main.c, que é um exemplo bem simples do uso da biblioteca.

#include <unistd.h>
#include <stdio.h>

void main(){
        printf("\nMeu id %i\n",getuid());
        printf("Meu group id %i\n",getgid());
}

No exemplo capturamos de forma direta o getuid e o getgid, onde mostramos os mesmos em uma mensagem.

all: compile

compile:
        gcc main.c -o ex01

No fragmento acima, temos o arquivo Makefile, ja nosso amigo de longa data, responsável pela compilação propriamente dita.

Listando as informações /etc/passwd

Este segundo programa, é um pouco mais complicado, ele varre a listagem de todos os usuarios, apresentando o conteúdo do passwd, e relacionando, conforme a estrutura do passwd.

#include <unistd.h>
#include <unistd.h>
#include <unistd.h>
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>

void main(){
        long uid = getuid();
        long gid = getgid();
        printf("\nMeu id %ld\n",uid);
        printf("Meu group id %ld\n",gid);
        struct passwd *ppw;
        int erro = 0;
        ppw = NULL;
        printf("Listagem de usuarios\n=======================\n");
        //pww = getpwent( ); /*Obtem a senha*/
        while((ppw = getpwent())!=NULL){
                if(erro !=0) {
                        printf("Falhou\n ");
                        //abort();
                } else {
                        printf("Usuario:%s\n",ppw->pw_name);
                        printf("senha:%s\n",ppw->pw_passwd);
                        printf("id de usuario:%d\n",ppw->pw_uid);
                        printf("id do grupo:%d\n",ppw->pw_gid);
                        printf("comentario:%s\n",ppw->pw_gecos);
                        printf("diretorio:%s\n",ppw->pw_dir);
                        printf("shell:%s\n", ppw->pw_shell);
                }
                printf("\n");

        }

}

Temos como saída o exemplo que se segue:

estrutura do passwd

Outras funções semelhantes

A função getpwuid retorna a estrutura passwd, igual a anterior, porem, ela pega apenas a de um uid especifico, utilizado para pesquisar a informação de user id.

struct passwd *getpwuid(uid_t uid);

Pesquisa por login,

struct passwd *getpwnam(const char* name);

Blog C/C++ CUDA IA pós graduação Python
Install CUDA toolkit em xubuntu 18.04

CUDA Toolkit é um conjunto de ferramentas desenvolvidas para programação em GPU.

Este processo tambem foi testado em uma máquina Ubuntu 20.04.02.

Informações relacionadas ao Toolkit:

https://developer.nvidia.com/cuda-toolkit

Para instalação é necessário verificar a sua distribuição, no caso do ubuntu ou xubuntu 18.04.

Siga os passos abaixo:

Baixe o arquivo pin

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin

Mova para o repositório de pacotes

sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600

Baixe agora o pacote cuda.

wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb

Instale o pacote conforme o comando abaixo:

sudo dpkg -i cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb

Adicione a chave do repositório

sudo apt-key add /var/cuda-repo-ubuntu1804-11-4-local/7fa2af80.pub

Por fim atualize a lista de pacotes:

sudo apt-get update

sudo apt-get upgrade

Baixando o pacote cuda, e suas dependencias.

sudo apt-get -y install cuda

Etapas intermediarias de instalação do CUDA
Processo final baseado no apt do pacote.

As informações aqui fornecidas, foram retiradas do site:

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=18.04&target_type=deb_local

Procedimento Ubuntu 20.04

Referencia:

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin

sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600

wget https://developer.download.nvidia.com/compute/cuda/11.5.1/local_installers/cuda-repo-ubuntu2004-11-5-local_11.5.1-495.29.05-1_amd64.deb

sudo dpkg -i cuda-repo-ubuntu2004-11-5-local_11.5.1-495.29.05-1_amd64.deb

sudo apt-key add /var/cuda-repo-ubuntu2004-11-5-local/7fa2af80.pub

sudo apt-get update

sudo apt-get -y install cuda

Tela da instalação do CUDA em UBUNTU 20.04
Finalização da Instalação do CUDA

Outros artigos

    Blog Dicas
    Moodle no Raspberry PI

    Moodle é uma plataforma de e-learning que permite escrever e armazenar cursos online.

    O moodle atualmente é a ferramenta online mais usada no mercado.

    Estaremos aqui apresentando uma solução de pequeno custo, para que voce desenvolvedor, crie sua própria “escola” online com um pequeno custo.

    Usaremos o Rasperry PI para instalar o Moodle.

    Primeiramente, é necessário ter um raspberry pi, no caso usei o Raspberry Pi 3, que apesar de sua capacidade limitada, da conta da tarefa.

    Baixar imagem no site

    Usaremos para instalar o moodle o projeto moodlebox.net, que disponibiliza uma imagem de distribuição instalável no raspberry pi.

    https://moodlebox.net/en/help/download-the-disk-image/

    A maior parte das informações aqui dispostas, foram compiladas deste próprio site.

    Baixe o aplicativo, e em seguida grave o cartão sd. Recomendo que o seu cartão tenha no mínimo 16gb, recomendável que seja maior, para que consiga usar uma base maior.

    Para gravar a imagem eu utilizo o programa win32disk, que pode ser baixado em :

    https://sourceforge.net/projects/win32diskimager/

    gravação do moodle em sd

    Após esta etapa, agora iremos instalar o cartão no raspberry, e liga-lo.

    Instalação

    Após a gravação do cartão, e ter ligado o raspberry pi.

    MoodleBox network topology
    topologia de instalação do Moodle

    O moodle ira ser instalado em sua maquina. Aguarde alguns segundos, para a instalação ser completada.

    Ao instalar o moodle irá criar uma rede wifi chamada moodle

    A senha será moodlebox tudo minusculo.

    Conecte-se a rede para finalizar.

    Após conecectado entre no browser e conecte-se através do site:

    http://moodlebox.home/

    Tela do moodle

    Percebi, que a tela demorou vários segundos para aparecer, no meu caso tive que desativar a conexão ethernet, e deixar apenas o wifi conectado.

    CLick no link de login, para entrar o usuário e senha.

    Autenticação

    Por padrão o usuário e senha são:

    • Usuário: moodlebox
    • Senha: Moodlebox4$

    Recomendamos que faça a mudança o mais brevemente possível destes.

    Conectar por Ethernet

    Para conectectar via ssh, é necessário descobrir primeiro o ip que o servidor DHCP, estabeleceu para sua maquina.

    Para isso entre no seu roteador, verifique o ip sorteado para ele.

    No meu caso foi esse, no seu pode mudar

    Agora é necessário incluir no arquivo hosts de sua maquina o seguinte padrão.

    No windows 10 o arquivo hosts fica em C:\Windows\System32\drivers\etc

    E para edita-lo será necessário estar em modo administrador.

    edição do arquivo hosts no windows 10

    Pronto sua maquina agora encontrará o

    http://moodlebox.home

    Acesso SSH

    Para conectar via SSH será necessário usar um cliente ssh, no meu caso uso o bitvise

    conexão com bitvise

    As informações de conexão são:

    • host: moodlebox
    • username: moodlebox
    • password: Moodlebox4$

    Agora vc pode trabalhar diretamente no servidor

    Acesso ssh no servidor Moodle.

    Próximos passos

    Em breve estarei adicionando novos postas, pois também sou aluno como você, e a medida que aprendo, publicarei novos posts.

    Blog C/C++
    C na WEB

    Criar aplicações capazes de interagir com o mundo externo, através de solicitações web, é uma prática muito util.

    Estaremos abordando aqui, como fazer isso.

    Estaremos explicando agora a API LIB CURL.

    Esta api é suportada pelo fabricante:

    https://curl.se/

    Baixando no Ubuntu

    Para baixar no ubunto execute os seguintes comandos:

    apt install libcurl4 libcurl4-gnutls-dev

    Apos instalar rode os seguintes comandos:

    sudo ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl

    sudo ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4 /usr/lib/libcurl.so.4

    Estes links irão permitir incluir os includes nos locais corretos e o lib p sua perfeita compilação.

    Rodando um exemplo

    Crie uma pasta no seu linux chamado sample, nela realize as seguintes operações:

    1. Crie um arquivo Makefile, conforme o que segue:
    
    all: compile
    
    compile:
    	gcc simple.c  -lcurl	-o simple
    

    2. Agora crie um arquivo simple.c, conforme segue:

    #include <stdio.h>
    #include <curl/curl.h>
    
    int main(void)
    {
      CURL *curl;
      CURLcode res;
    
      curl = curl_easy_init();
      if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
        /* example.com is redirected, so we tell libcurl to follow redirection */
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    
        /* Perform the request, res will get the return code */
        res = curl_easy_perform(curl);
        /* Check for errors */
        if(res != CURLE_OK)
          fprintf(stderr, "curl_easy_perform() failed: %s\n",
                  curl_easy_strerror(res));
    
        /* always cleanup */
        curl_easy_cleanup(curl);
      }
      return 0;
    }

    O exemplo acima é uma cópia do código apresentado na documentação.

    O Repositório do projeto pode ser visto no link abaixo:

    https://github.com/curl/curl/tree/master/docs/examples

    Para compilar basta dar make, conforme o exemplo:

    Segue o exemplo rodando:

    Em breve detalharei sobre como funciona este exemplo.

    Sem categoria
    Criando aplicação debugavel no linux

    Objetivo

    Neste tutorial, apresentaremos o básico necessário para permitir a criação de uma aplicação, inclusive debugar quando necessário.

    Gerando o binário

    Neste tópico criarei um binário, que é um executável.

    Para este exemplo, usarei o projeto do git:

    https://github.com/MarceloMaurin/srvFalar

    O projeto é um servidor de sintetização de voz, um maior detalhamento sobre este projeto pode ser visto no artigo abaixo:

    http://maurinsoft.com.br/index.php/2021/06/15/servidor-de-fala/

    Makefile

    O Makefile é o construtor da aplicação. Com ele podemos gerar o binário, bem como realizar atividades de instalação e preparação, previas para sua construção.

    Outra atividade de responsabilidade do Makefile, é a geração de versão de debug.

    Abaixo o exemplo do Makefile do nosso projeto.

    #HEADERS = program.h headers.h
    
    MYESPEAK=-lespeak
    
    default: all
    
    all: clean compile install
    
    compile:
    	gcc  fala.c $(MYESPEAK) -Wall -o SRVFalar
    
    install:
    	cp  SRVFalar /usr/local/bin/
    
    debug:
    	gcc fala.c $(MYESPEAK) -g -Wall -o SRVFalar
    
    clean:
    	rm -f /usr/local/bin/SRVFalar
    	rm -f ./SRVFalar
    

    Nele exemplo podemos ver que existem 5 alvos de compilação:

    • all
    • compile
    • install
    • debug
    • clean

    O alvo all, é o padrão, e quando não indicado um alvo de compilação no make, usa-se este por padrão.

    make

    make sem alvo, subentende-se o all

    Podemos também usar o alvo debug, que é destinado a gerar os binários de debug.

    make debug

    gerando binario de debug

    O compilador GCC, possui como parametro de debug o -g, que deve ser usado quando se deseja debugar uma aplicação.

    gcc fala.c $(MYESPEAK) -g -Wall -o SRVFalar

    A seguir, estarei apresentando um vídeo sintetizando cada passo descrito acima.

    Debugar é

    Debugar é entender o que esta acontecendo internamente em um projeto, analisando cada passo de um programa.

    Analisando não só suas entradas e saídas, mas tambem os passos e atividades relacionados a sua execução.

    Usando o DEBUG

    Para utilizar o debug, usamos o comando:

    gdb <progrma> [fonte]

    sintaxe do gdb

    No nosso caso podemos chamar o debug, através do exemplo abaixo:

    gdb SRVFalar

    Os comandos do debug podem ser vistos, através de outro artigo que montei:

    http://maurinsoft.com.br/index.php/2021/02/08/comandos-do-gdb/
    Comandos do GDB

    A seguir mostrarei como utilizar o debug de forma prática.

    Segunda parte do tutorial

    Emulando passagem de argumentos

    Quando houver necessidade de emular a execução do binário com passagem de argumentos, siga os seguinte passos:

    Entre no gdb

    gdb [aplicação]

    Execute o comando set, passando os argumentos, conforme figura abaixo:

    set args [arg1] [arg2] … [arg3]

    Por fim inicie a aplicação com o debug.

    r

    Debug remoto

    O Debug remoto, é necessário quando temos uma maquina e o nosso ambiente de desenvolvimento esta em outra.

    Desta forma, é possível identificar problemas de hardware ou software na maquina alvo, sem de fato estar alocado nela.

    O Debug remoto é divido em 2 parter:

    1. Servidor de debug ou máquina debugada
    2. Ambiente de desenvolvimento

    Maquina debugada

    Nesta máquina é necessário instalar o servidor de debug. Pois iremos nos conectar nela.

    Para funcionar, a maquina precisa ter uma porta TCP liberada para a maquina de desenvolvimento.

    O programa que será necessário é o gdbserver, que pode ser baixado no ubuntu pelo comando:

    apt install gdbserver

    Depois das pré-condições liberadas para seu desenvolvimento, precisamos rodar o gdbserver, através da sintaxe:

    gdbserver [aplicacao] [host]:[port] <&>

    A aplicação é o binário que deseja ser debugado, como no gdb, precisa ser criado com a opção -g

    O host é a o ip que será ouvido, podendo ser localhost

    Port , é a porta tcp que será criada, para receber os comandos.

    Segue o exemplo abaixo:

    Ambiente de desenvolvimento

    Agora iremos debugar no ambiente de desenvolvimento, que possui os fontes.

    Para isso usaremos o nosso velho gdb.

    gdb

    target remote localhost:23456

    Passando em seguida o target remote [host]:[porta], ligamos o server ao cliente, e conseguimos o debug remoto.

    Conforme figura abaixo:

    Debug remoto
    Blog C/C++
    Encontrar um arquivo ou pasta no linux

    Segue aqui a dica resumida, para encontrar os detalhes do comando recomendo o site abaixo:

    https://www.hostinger.com.br/tutoriais/find-locate-comandos-linux?ppc_campaign=google_performance_max&gclid=CjwKCAjwgviIBhBkEiwA10D2j5gn-zNuacy-dlXGhs4xPyKJ6jg_FxZ6_zFGZaA8Ii0-ZGWZ6oI3vxoCrn4QAvD_BwE

    Para buscar uma pasta ou arquivo use o comando no linux:

    find <diretorio> -iname “oque procura”

    Exemplo de codigo:

    find / -iname “stdio.h”

    C/C++ Dicas Sem categoria
    Desenvolvendo com múltiplos terminais

    Em linux, as vezes precisamos de um terminal ou 2 para executar ações que as vezes são necessárias.

    Uma dica bem útil para o desenvolvimento é o Terminator.

    exibição do terminator

    Segue o artigo, que foi baseado este post, espero condensar um pouco os principais comandos.

    https://www.tecmint.com/terminator-a-linux-terminal-emulator-to-manage-multiple-terminal-windows/
    Artigo de referencia, bem mais completo.

    Instalação do terminator

    Para instalar no ubuntu, siga os passos a seguir:

    apt install terminator

    Com isso o terminator será disponibilizado em sua aba gráfica.

    Principais comandos

    AtalhoDescrição
    CTRL+SHIFT+OQuebra Horizontal
    CTRL+SHIFT+EQuebra Vertical
    CTRL+TABSeleciona aba
    CTRL+SHIFT+WFecha aba ativa
    F11tela cheia
    C/C++ Dicas Sem categoria
    Instalando o sublime no Ubuntu

    O processo atualizado do sublime do sublime pode ser visto no site:

    http://www.sublimetext.com/docs/linux_repositories.thml#apt

    Procedimento de instalação

    Instale a chave GPG

    wget -qO – https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add –

    Instale o componente de transporte https

    sudo apt-get install apt-transport-https

    Adicione o repositório estável

    echo “deb https://download.sublimetext.com/ apt/stable/” | sudo tee /etc/apt/sources.list.d/sublime-text.list

    Agora atualize e instale o sublime

    sudo apt-get update
    sudo apt-get install sublime-text

    Exemplo de utilização

    subl [fonte.c]

    Código do sublime

    Atalhos do Sublime

    CTRL+p

    AtalhoO que faz
    CTRL+p Busca nos arquivos aberto
    CTRL+gindo até a linha
    CTRL+rbuscar por função
    CTRL+ç;Buscar por palavra chave no arquivo
    CTRL+SHIFT+fBusca em arquivos do projeto
    CTRL+XApaga linha
    CTRL+SHIFT+vColar com endentação
    Texto marcado -> TABRecuar
    Texto marcado -> SHIFT + TABVoltar Recuo
    CTRL+K ; CTRL+bEsconder sidebar/Exibir
    CTRL +;Comentar codigo

    C/C++
    Endentação de código em C

    Endentação definição:

    ato ou efeito de endentar.

    Como o próprio nome diz endentar é deixar o código mais legível e bonito, melhorando o entendimento sobre o mesmo.

    Como endentar código em C no Linux

    Para endentar o código em C, usaremos o comando indent , que explicaremos a seguir.

    Instalação do Indent

    A instalação do indent, é extremamente simples, para tanto, usaremos o comando:

    apt install indent

    O vídeo abaixo mostra como fazer o processo de instalação.

    apresentação da instalação do indent

    Endentando o código em C

    O processo de endentação é muito simples.

    Basta digitar o comando como se segue:

    indent [nome_do_fonte.c]

    O programa irá endentar no padrão, segue um vídeo demonstrando seu uso.

    Apresentação prática do indent em código de projeto.

    Customizando Endentação

    A endentação do código pelo comando indent, pode ser mudada conforme sua necessidade.

    No site https://linux.die.net/man/1/indent , voce pode ver a explicação completa das sintaxes disponíveis para o indent.

    Estarei explicando poucos comandos estilisticos.

    indent -br [codigo_fonte.c]

    Forçamos que o { esteja no final da linha que o gerou.

    Comando -br

    Perceba que o } não entrou na jogada, se incluirmos o parametro -ce, tambem alinharemos ele.

    indent -br -ce [codigo_fonte.c]

    Conforme figura abaixo:

    opções de indent

    Declaração de valores

    Agora, vamos ver a declaração de valores, com endentação.

    O parametro -di, inclui declaração conforme o apresentado:

    indent -di16 [fonte.c]

    Neste exemplo percebemos um recuo, entre o tipo e seu nome.

    recuo do parâmetro -di16

    Já o parâmetro indent -di2

    indent -di2 [fonte.c]

    Separa o tipo de seu nome de variável, pulando uma linha.

    Existem uma infinidade de parâmetros do indent. Entre no site, e busque a que melhor se adequa a seu código.

    Shell Script
    Atualização hora

    Para deixar automatizado a atualização de hora, é possível realizar um agendamento para rodar a atualização da data, usando o comando ntpdate.

    Desta maneira, sempre que o servidor for aberto, ele auto atualizará.

    Procedimento:

    Entre na pasta /etc , edit o arquivo crontab

    10 * * * * ntpdate -u server ntp.research.gov

    10 * * * * ntptime -s server ntp.research.gov

    Salve este comando.

    Desta forma o pdv será atualizado, de 10 em 10 minutos, sem necessidade de novas modificações.

    Servidores de NTP no Brasil

    • server 0.br.pool.ntp.org
    • server 1.br.pool.ntp.org
    • server 2.br.pool.ntp.org
    • server 3.br.pool.ntp.org

    pt_BRPortuguese