É coleguinha! Eu fico imaginando, eu fico imaginando o cara olhando meu livro e falar porra, mas isso aqui é um livro de programação, é um livro de sistemas operacionais ou é um livro hacker, caramba! Meu amigo, nesse mundo da tecnologia você tem que ser tudo porra! E é por isso que eu ensino o cara a programar. Só pra você ter uma noção, um curso bosta, um livro bosta, na hora de ensinar e instalar o capítulo de instalar coisas no Linux, ele só ensina você a baixar um pacote da internet e instalar. No meu, você vai ser obrigado a fazer seu próprio programa, você vai ser obrigado a fazer o seu próprio pacote de instalação e aí eu deixo você instalar o seu pacote. Ah, que aí seria o curso bosta! Fora, vem cara! É assim a ideia cara, eu quero fazer o cara completo, um cara completo, não quero fazer um meia boca. Então vamos lá, você sabe, Ctrl-O pra salvar, né? Ctrl-O deu certo, né? Ctrl-O, cara, às vezes eu aperto com um parque, isso é esse nome, foi mal, é esse seguir. Vamos lá, então eu estou aqui com o Nano e eu vou fazer um programinha que é o clone do nosso amigo CP, que é o copiar do mundo Linux. No mundo Linux nós temos um comandinho que eu vou mostrar mais pra frente pra vocês, chamado CP. Tá? Bom, e esse comandinho CP, ele faz cópia. Então vamos fazer cópia, fazer um colosso também, só pra mostrar essa questão de ler, escrever, o que eu tanto falei, beleza? Olha que interessante, então eu vou fazer a importação aqui de três, nós chamávamos isso de cabeçalho. Nesses cabeçalhos já tem as funções colocadas e criadas, funções naturalmente do C++ para Linux. Você não vai encontrar isso aqui, assim, lá no mundo Windows não. Beleza, lá é o... na verdade, lá são outras bibliotecas, outros arquivos cabeçalhos, são outros. A programação pro Linux não vai funcionar lá. Então nós temos aqui os três que nós vamos utilizar nesse programa. O mais chato de se programar em C++ para sistemas operacionais é conhecer essas bibliotecas. Mas você só vai conhecer essa biblioteca C++, somente C++, você fizer alguma coisa. Se você não programar, meu filho, você nunca vai aprender. E esse é o maior empecilho... Peraí, peraí, peraí, foi maior galera, peraí, contro... E esse é o maior empecilho então do cara hoje na TI, né? Ele não quer programar. O aluno chegou pra mim e perguntou pra mim, qual é o problema? Pra que que serve esse código que você tá me pedindo? Aí eu expliquei. Aí sabe o que ele falou pra mim? Eu sei, eu vou saber pedir pra ir. Peraí, quem é que vai aprender? Quem é que tá lá pra aprender na sala de aula? É o aluno ou é a inteligência artificial? Porque se for inteligência artificial, eu vou pro meu aluno tudo pra correr e vou chamar a inteligência artificial e vou assim... Vem cá, fia, vou em cá que eu vou te ensinar a programar. Porque você é artificial e eu não, vem cá, vem cá, vem. Não, pô, é pra vocês errou ela, você tem que aprender a programar, amigo. Então você tem que exercitar, legal? E nesse livro você vai ficar muito bom de ser mais mais. E Python, e Bache, e de só. Vamos então importar as três. Esse cara aqui nós vamos utilizar para abrir arquivos, nós vamos ter algumas constantes aqui dentro. Aqui é o standard Lib do C++. Vamos rodar, naturalmente, usar standard Lib e vamos definir isso na compilação com a versão do C++. Como assim? O C++ tem versão, tá? Aqui nós vamos ter o Read, o Write, nós vamos ter mais algumas constantes de sistema. Tem que ir lá e conhecer. O que é isso aqui que eu coloquei? Tem que ir chamando de assinatura, tá? Por exemplo, eu estou dizendo que nesse sistema nós temos uma função estrutural. Isso aqui não é orientado a objetos, embora, sei mais, mais, permitam orientação a objetos. Aqui eu não estou utilizando porque a rotina é simples. E é um papo que a gente tem que ter mais no futuro sobre programação estruturada ou programação orientada a objetos. E nós estamos operacionais. E estou dizendo que existe no sistema uma função chamada main que recebe int args e um array ali, no caso endereço de onde está na memória, um array. E eu estou dizendo que vai ter isso aqui e ponto e vírgula. Beleza? E logo embaixo eu implemento. E eu implemento. Beleza? Como que é uma programação profissional nas empresas? Eu criaria um ponto h, chamaria copiar ponto h. Eu colocaria isso aqui lá no copiar ponto h, entre outras coisas. Eu coloquei essas definições aqui lá no h, no ponto h. E aqui então eu chamaria o meu ponto h. Chamaria o meu ponto h aqui nessa linha. Eu não precisaria de colocar essas linhas aqui. Entendeu? É, eu vou te dar a tecla errado. E aí eu estou definindo. Buffer Size é uma constante de sistema. É uma constante de sistema, não pode ser modificado. Buffer Size. Sempre que nós fazemos uma constante de sistema, é tudo caixa alta. Sempre criamos as constantes com o nome dela tudo em caixa alta. É um padrão. Então quer dizer que Buffer Size vai ser relacionado ao número, na verdade, a sequência de dígitos 4, 0, 9, 6. Sempre que eu falo em output mode, eu vou falar na sequência de dígitos 0. Sei que você vai estar falando por mais. Não é 640? Não, é 0, 6, 4, 0. É uma constante que vai estar chumbada na memória. Pronto. Agora eu vou fazer o seguinte, vou criar dentro do mem, as variáveis de inteira com o endereço, vamos colocar assim, o descritor, vamos colocar assim, do input. O file descritor. O output descritor, o total que eu consegui ler e o total que eu consegui escrever de bytes. Então qual é o macete? Esse código, nós vamos fazer assim, conforme o copiar. Nós vamos chamar o nosso programinha, a... ah, pera aí, agora lembrei. Nós vamos vir aqui, nós vamos lá no terminal, vamos escrever assim. Copiar, seria o seu ponto XZ, tá galera? No mundo Linux, não é XZ. Sabe o que é que é no mundo Linux? Porra nenhuma, a gente não põe extensão pros binários. Entendeu? Entende isso agora de XZ aqui. E aí, um arquivo idiota, ponto XZ, lembra que nós criamos um arquivo idiota. E dois arquivos idiotas, ponto TXT. Então eu vou fazer isso, eu vou chamar o meu binário que eu estou programando aqui agora. E aí ele vai pegar esse arquivo que já existe e vai criar um novo arquivo e vai jogar o texto lá dentro aqui. Legal? É o copiar. É o copiar, é isso que ele vai fazer. Então, estamos lá. Beleza, então eu preciso desses contadores de leitura escrita, de bytes do arquivo e qual o endereço do arquivo de entrada e qual o endereço de arquivo de saída. É um número inteiro. Eu sei que você vai me falar assim, porra, mas não é um PFE? Então, coleguinha, eu vou explicar. Os arquivos vão ser mapeados na memória, na área de descritores. E aí nós vamos manipular eles em memória, como o endereço. Beleza? E aí para isso o Linux nos dá um endereço inteiro, que com esse endereço inteiro nós chegamos no endereço de memória que tem um arquivo. Bom, pelo menos nós não temos que trabalhar com ponteiros aqui agora. Um array de char com o tamanho de 4,096. Então, olha só que interessante, se seu arquivo tiver 1 GB, ele vai copiar de 4,096 bytes a 4,096 bytes por vez. Por que isso? Se você pegar o livro do Datedl e aprender a programar, você está fudido. Fudido, completamente fudido. Ele vai mandar você ler o arquivo de 1 GB e jogar na memória. Na hora de você jogar na memória, cresce o sistema, porque o sistema tem que ter um tempo para crescimento. Cara, eu estou falando que quando você ensina a programar e você ensina o sistema operacional, você ensina coisa pra caralho. Isso cara não acredita, por isso que eu ensino a programar. O seguinte, então, aqui eu tenho a memória, certo? E aí a memória eu tenho os processos sendo colocados, certo? Eu tenho dois processos sendo colocados aqui, legal? Ó, tá aqui, dois processos, beleza. Os processos, na verdade, estão nessa memória que ela é uma memória virtual, certo? A real, a real, na realidade. A realidade é muito diferente. A memória física é muito diferente. Eu tenho os pedacinhos assim, as páginas, né? Páginas é moldura. Moldura no disco, que eu te falei a memória. Ó, professor Randa aí, esquecendo aí os termos técnicos, hein? Normal, galera. Então, quer dizer que tá assim na física, pô, mas é assim que nós enxergamos. É assim que enxergamos, mas na realidade o treco todo tá assim. Legal, beleza. Então, é possível presta atenção. Se o processo vermelho precisar, é possível que eu crie e aloque novas páginas pra ele. Então, é possível expandir esses processos. É possível expandir. Só que isso demora um tempo. É tipo um RPG, cicos. Então, se eu puxar um giga e jogar um giga, não vai. Mas se eu ficar pegando, pegando, pegando e puxando, talvez dê. Talvez. Talvez. A palavra talvez é foda. E eu não quero depender de talvez. Como assim? Então, se tiver 4 giga, eu vou fazer o seguinte. Ó, 1 giga, eu vou ler 4 bytes. Eu vou no segundo arquivo e vou escrever 4 bytes. Aí eu vou voltar. Vou limpar os 4 bytes, vou zerar. E vou ler mais 4 bytes. Vou escrever um arquivo novo, os 4 bytes. Vou limpar. Repara que eu nunca passo de 4 bytes. De leitura. Então, a minha memória vai ser sempre pequenininha pro meu processinho. O problema é que o número de interações do laço aqui vai ser o número muito grande. Então, você pode mexer nisso aqui. Poxa, eu quero multiplicar 4 bytes por 10. Então, você multiplica por 10 e aí você vai naturalmente fazer menos laço de repetição. Mas só que você vai trabalhar assim, você vai ler 40 bytes e escrever 40 bytes. Ler 40 bytes, escrever 40 bytes. Sendo que o mundo Linux, os arquivos não são tão grandes assim. Arquivos são geralmente pequenos. Tanto que o bloco do sistema de secundário de amazenamento é 4 bytes o padrão. Que é uma coisa que vamos falar mais para frente. Cara, eu estou prometendo muita coisa, mas está tudo no livro. Por isso que eu sei que eu estou prometendo, eu vou cumprir. Legal. Então aqui, olha só que interessante. Se eu não tenho 3 argumentos, eu saio da execução. Aqui, isso é um WIFI. Muita gente vai falar assim, mas o WIFI não tinha que ter uma chave aqui, outra chave aqui e assim. Num padrão C mais mais, desculpa, do padrão C mais mais é assim. Certo? Esse é o padrão C mais mais. Chave embaixo do WIFI assim. Legal? Padrão Java é assim. Esse é o padrão Java e C-Sharp. A chave aqui do lado. Não tem diferença nenhuma na execução. É só que tem menos linhas. E é importante. Você vê que se eu cometer chave em tudo aqui, esse código vai ultrapassar essa tela e eu vou ter dificuldade de visualização. Antigamente, quando eu aprendi a programar, final de 90 e casetada, no ano de 2000, eu só poderia ter funções de no máximo 23 linhas. 23 linhas, o meu professor enxamei o saco. Essa era a história. Então tinha que compactar. Mas repare, esse WIFI só tem uma linha, um comando. Então quando nós temos um WIFI ou um ILE com um único comando, por exemplo, um FOR com um único comando, nós podemos não usar a chave. Nós estamos dizendo que esse WIFI, sem chave, só tem um comando, que é a próxima linha baixa, acabou. Só que, lembra que eu falei das 20 tantas linhas? Um programa do moderno, o programa sim. Um programa do velho da minha idade, programa assim. Que dá na mesma. Mas porra, mas como assim? É dessa forma que nós entendemos. Silmauer, um formato de script, foi escrito por um cara com mais de 40 anos ou com menos de 40 anos. Baseado em como ele aprendeu a programar, de como ele aprendeu a escrever o código. E isso é um campo dentro da CyberSecurity, que tem uma necessidade de programadores absurda e pessoas que entendem disso. Sabe por quê? Não tem um cara assim no mercado, que é capaz de entender esses códigos assim. Como eu estou explicando, sobre tal anos os caras faziam assim, tal anos os caras faziam assim. Um cara que aprendeu a programar em C aprendeu assim. Um cara que já é mais novo, não é tão raiz. E ele programou em Python, programaria assim. É assim que nós trabalhamos. É um campo foda para caramba dentro da CyberSecurity. E tem pouca gente apta a trabalhar nessa área. Bom, aqui eu estou dizendo, olha só, lembra que importei umas bibliotecas aqui. Aqui é para mexer com algumas constantes e alguns command line. Aqui para você ter umas constantes no sistema. Então nós podemos usar. Então, olha, que é uma constante que dentro dessas bibliotecas é somente leitura. Que vai ser aberto o primeiro arquivo somente leitura. Como assim? Posição 1 começa de zero? Então, vamos lá. Para você entender se parar na UE, eu falei, vamos voltar aqui ao nosso desenho. Para ensinar programar, ensinar semos operacional, é a mesma coisa. Copiar um arquivo 1, arquivo idiota, ponto TXT, dois arquivos idiota... Galera, não poderia dar mais de um espaço aqui não, tá? Mas eu vou dar para você enxergar mais, tá? Eu vou dar mais de um espaço aqui para você enxergar, pô. Mas imagine que isso aqui é um espaço só. Então, esse aqui é o argumento zero, que é o nome do programa. Esse é o argumento 1 e esse é o argumento 2. Por isso que eu preciso de ter aqui no código, três argumentos. O zero, o 1 e o 2. Três argumentos. Então, o primeiro argumento é esse cara aqui. Argumento 1, que é o arquivo que eu quero copiar. E o argumento 2, é esse arquivo aqui, o que eu vou criar. Entendeu? E do formato output-mode, ou seja, eu vou escrever lá. Beleza? E sempre assim, olha que interessante, tá vendo aqui? Se essa abertura que tá aqui, the pal, vai retornar um lixo de memória nesse inteiro. Um lixo de memória. Todo lixo de memória é negativo e bem grande. Então, se for menor que zero, deu pal. Falhou, falhou. Exite 2. Como assim, existe 2? Porque existe 1? Vou explicar. Quando você executa um programa como esse, ele vai ser executado e no final, ele vai informar pro SEO um número zero. É igual a sucesso. Qualquer número maior que zero, deu merda. Deu merda. E aí nós criamos o programador e ele cria uma tabela de merdas. Tá? Tabela de merda. Cara, é o tipo de... Então, vamos lá. Merda 1. Não tem 3 argumentos. Sério, cara, o cara vai criar uma tabelinha assim, fi. Não tem 3 argumentos. Nesse tipo de tabela que tá pensando, não, seu pô. 2. Tá lá, ó. 2. Não foi possível abrir. Não poder abrir. 3. Tá escrito lá, ó. 3. Não pode criar. Vamos colocar todos. Cadê os 4? 4. 4 tem algum lugar aqui? 3. Ah, se ele pôde aqui, ó. 4. Upa, fiz merda. Não, pera aí. 4. Não pode escrever. E 5. Não copiou tudo. Tá bela de merda. Das merdas que pode acontecer no sistema. Então, o programador cria essa merda. Quer ver? Quem é programador de banco de dados já viu. Erro no banco de dados número 9740 que acetada. Pula, cara. Tá bela de merda dos caras, tem 9000 que acetada? Muito mais, tá? Tem umas 60 mil merdas lá, que pode acontecer. Então, alguém mapeou esses números tudo. Então, quer dizer o seguinte. Que quando eu dou um exit zero, eu tô informando para o sistema operacional, que ele deve informar que deu tudo certo. Quer ver a jogada? Legal. E aí, então, eu passo para um IUTRU aqui, o IUTRU, porque eu não sei quantos bits tem. Ah, eu poderia ler total de bits? Não, cara, porque o total de bits é uma previsibilidade. Não é certeza. Porque ele não poderia contar o tamanho dos arquivos, dos bits e dos bytes. Não é assim. Então, eu não vou passar um IUTRU contando para saber, depois eu vou lá e vou ler. Eu não vou fazer esse tipo de merda. Então, eu faço um IUTRU logo e já começa a ler. RdCount, é um inteiro. O que o IUTRU vai fazer? O RID vai, primeiro parâmetro, um inteiro, que diz aonde tá o arquivo lá na memória, que vai estar em algum lugar. Passo como parâmetro, o array de char de caracteres. E tô dizendo, leia no máximo 4.096. Digamos que o arquivo tem 6 kb, vou repetir, o arquivo tem 6 kb. Ele vai vir, vai colocar aqui 4.096 aqui. Certo? E aí ele vai ver. 4.096 é menor que zero? Não. Então, ele vai lá no arquivo de escrita, aponta para memória para o arquivo de escrita. Passa o array de 4.096 char, bytes no caso, e passa que é para escrever do array de 4.096 bytes, ou os 4.096 bytes lá no arquivo. E aí ele escreve. Se ele escreveu, esse WT Count terá 4.096. Veja, RdCount 4.096, WTCount 4.096, você poderia comparar os dois. Você poderia comparar os dois. Quanto eu li, foi o quanto eu consegui escrever. Legal? Isso faz toda a diferença num pendrive, por exemplo. O pendrive, você copiar para um pendrive, você tem que verificar. Não diz com o rígio do SSD, não. Legal. E aí você volta lá em cima. Voltei nessa linha aqui, certo? Vou no arquivo, coloco um array de 4.096 e falo, pô, ler 4.096, mas não tem 4.096 bytes lá. Tem 2.048. Então, RdCount vai ficar 2.048. E vai preencher dos 4.096 bytes, vai preencher 2.048. Você vai me perguntar, e os outros 2.048? Lixo de memória, vai ficar uma porcariada lá de memória, que não nos importa. O que nos importa são os primeiros 2.048 bytes. Então, eu vou lá no arquivo de escrita, passo array de 4.096 e falo, do array de 4.096, usa só 2.048, por favor. Por favor, pelo amor de Deus. Porque depois do 2.048, ou seja, lá no 2.049, já tem lixo de memória. Não use isso não. Então, o WtCount, depois dessa operação, tem que dar 2.048. 2.048 no WtCount, RdCount, 2.048 bateu. Legal? Vamos lá outro, mandei ler. O arquivo de entrada, um array de 4.096 e 4.096, que eu estou pedindo para ler. Não tem mais nada. Então, ele vai me dizer, RdCount é igual a 0. Aqui. RdCount é igual a 0? É. RdCount, 0 é, não tem nada mais para ler. Menor que 0 é, pau, cresceu. Por isso que tem menor e walking. É igual a 0. Então, dá um break e sai do aio. Sai do aio e sai do aio. Cheguei aqui. Fecho o arquivo de entrada, fecho o arquivo cópia de saída. RdCount é igual a 0? Sim, RdCount é igual a 0. Deu tudo certo, exit 0. Não, RdCount é 1, RdCount é 100, RdCount é menos 500, não importa. Exite 5, deu merda, é escrita. E aí, está pronto. Legal? Esse é o código. Veja que dá para explicar muita coisa de programação para vocês, se temos opressionais simplesmente programando. Lembrando que eu estou no TMP. Beleza? Legal. Vamos lá. Como que eu gera um executável dessa brincadeira? Tá bom, vamos lá. Olha a mágica, hein, coleguinha? Olha, coleguinha! Sudo-APT install g++. Vamos compilar ele com g++. Deixa, eu já está instalado, lógico, né? Máquina de programador? Pô. Então, eu venho aqui e coloco g++. Vou copiar, tá? Traçou o copiar. E caramba, copiar CPP, caramba. Desculpa, galera. Vacilei, hein? Já existe, né? Então ele não deixou, caramba. Foi mal, hein? Cara, estou pensando em outra coisa aqui, cara. Estou alucinado com o problema. Eu tenho que resolver hoje. Tá lá, olha só. Tá aqui, ó. Copiar. É o seu copiar.txt do mundo Windows, né? File, copiar. Ele é um executável, dinamicamente linkado e tudo mais. Veja que eu fiz o meu próprio programinho de copiar. Legal. Então, vamos lá. Vamos escrever um texto? Nano, origem.txt. Olá! Seja Botafogo. É? Vire. Botafogense. Olha o Botafogo. Botafogo. Não. Não é viral. Ah, caraca. Tá aí uma coisa que o gringo nunca vai entender, né? Então vamos copiar esse arquivo, né? Clear. Então vamos lá. Copiar. Pera aí. É, é lesto. Eu fiquei brincando, cara. Esqueci completamente, estava lá. É, ponto barra, copiar. Por que ponto barra? Se você chamar um programa assim, ele vai tentar procurar no diretório do sistema. E nós não estamos no diretório lá do sistema, do PEP, né? Então eu tenho que dizer obrigatoriamente, da onde eu estou, tenho um programa chamado copiar. Porque barra TMP não está na lista de PEPs do sistema. E aí são papo que a gente vai ter mais para frente. E aí eu coloco aqui origem, tá? E destino. Ponto txt, certo? Se tudo deu certo, LS, traço L, eu vou encontrar o destino aqui. Não é o mesmo arquivo. Olha só. O iNode é diferente. Eu já dei uma aula de iNode para vocês. Um é o iNode 97, o outro é o iNode 96. É diferente. São dois arquivos diferentes. Legal? Yes. Então eu posso dar um cat, que é para escrever na tela aqui. É muito mais que isso, tá? Mas agora você só precisa saber que o cat vai escrever na tela. Da onde eu estou, está o do destino, certo? Da onde eu estou, está o do destino do umEnter. Olha lá. Ah, coleguinha! Os arquivos são iguais, cara. Cara, vocês viram que quando você aprende a programar, e se você aprende a programar de verdade, você aprende sistemas operacionais, redes de computadores. É isso que você precisa aprender, coleguinha. Entende? É isso que eu quero te ensinar. Mas dói. Dói para caralho. É coleguinha mostrando e funcionando. Até a nossa próxima aula. Até mais. Tchau.