Dúvida sobre os esqueletos.

Dúvida sobre os esqueletos.

por Caio Braz -
Número de respostas: 11
Uma pequena dúvida sobre os esqueletos que foram fornecidos junto com o enunciado do EP4.

Tudo que está la pode ser usado livremente? Como por exemplo a função que abre o arquivo pgm, ou tem alguma restrição?

Eu acredito que possa, é só pra confirmar mesmo.
Em resposta à Caio Braz

Re: Dúvida sobre os esqueletos.

por Francisco Reverbel -
Sim, pode usar à vontade, mas leve em conta que esses esqueletos foram escritos às pressas. A função read_image_file dos meus esqueletos só funciona para arquivos PGM textuais e não reconhece comentários.

Em resposta à Francisco Reverbel

Re: Dúvida sobre os esqueletos.

por itai Soares -
eu nao entendi o que signifca esse strcmp, alguem pode me explicar plis???
 
if (strcmp(key, "P2") != 0) {
        printf("Formato desconhecido\n");
        fclose(entrada);
        return FALSE;
    }

**************************************************************
e tambem nao entendi essa funcao direito, nao sei o que é esse "pid_t pid" esse "setpgrp" e esse   "killpg(pid, SIGQUIT);", nao sei o que ta acontecendo direito nessa funcao =/....  alguem pode explciar essa tambem plis?

int run_viewer_and_get_option(char command[], char message[])
{
    pid_t pid;
    int retval;

    if ((pid = fork()) == 0) {
        setpgrp();
        system(command);
        exit(0);
    }
    retval = get_option(message);
    killpg(pid, SIGQUIT);
    return retval;
}
*************************
e pra finalizar...hehehe... eu nao entendi pra que serve a funcao copy, pq pelo que entendi a funcao horizontal_flip cria uma matriz b invertida e dps na funcao copy a matriz b recebe todos os valores de a de volta... ou to errado??bem provavel...heheh

muito tênquiu...
Em resposta à itai Soares

Re: Dúvida sobre os esqueletos.

por Rodrigo Luiz Marques Flores -
A strcmp(char *a, char *b) é uma função que recebe dois strings e devolve 0 se são iguais e != 0 se forem diferentes. Esse diferente de 0 pode ser negativo se a string a for menor que b na ordem lexicográfica (ou seja a vem antes de b no dicionário) e positivo se a for maior que b na ordem lexicográfica (a vem depois de b no dicionário).

Exemplos:
  • strcmp("bola","bola") devolverá 0
  • strcmp("aola","bola") devolverá um int < 0
  • strcmp("bola","cola") devolverá um int > 0

Em resposta à itai Soares

Re: Dúvida sobre os esqueletos.

por Rodrigo Luiz Marques Flores -
Parte 2

1 int run_viewer_and_get_option(char command[], char message[])
2 {
3   pid_t pid;
4    int retval;
5    if ((pid = fork()) == 0) {
6       setpgrp();
7       system(command);
8       exit(0);
9    }
10    retval = get_option(message);
11    killpg(pid, SIGQUIT);
12   return retval;
13 }

Essa função cria com o fork (linha 5) um processo "filho" no sistema e roda o "eog tmp_file" que é o command para você ver a imagem. 

Com a killpg (linha 11) você mata esse processo.
Em resposta à itai Soares

Re: Dúvida sobre os esqueletos.

por Rodrigo Luiz Marques Flores -
Parte III

Isso mesmo. A horizontal_flip cria uma outra matriz b com a matriz a invertida e depois copia todos esses valores em a e assim ela faz o horizontal_flip.
Em resposta à Rodrigo Luiz Marques Flores

Re: Dúvida sobre os esqueletos.

por itai Soares -
Valeu Rodrigo e Igor por terem respondido...o zuado é o seguinte, pq la no gcc compila de boa, mas agora to tentando compilar no dev, aí da erro assim que a variavel SIGQUIT não foi declarada, mas eu nem sei o que é esse processo de matar o programa direito e nao sei o que é o segundo parametro, o problema é que nao compila, ai nao roda no winblows... =/

ah, eu dei uma roubada só pra tentar fazer funcionar...eu coloquei int SIGQUIT, nao deu certo, coloquei pid_t SIGQUIT nao deu certo... ai jesuisi!!!...peor que nao tenho linux em casa ...=/...quantos gbs ocupa o ubuntu?ou gnome...sei la, eu sempre confundo gerenciador de janela com distribuicao....heheheh

desde já muito tênquiu novamente
Em resposta à itai Soares

Re: Dúvida sobre os esqueletos.

por Igor dos Santos Montagner -
int run_viewer_and_get_option(char command[], char message[])
{
    pid_t pid;
    int retval;

    if ((pid = fork()) == 0) {
        setpgrp();
        system(command);
        exit(0);
    }
    retval = get_option(message);
    killpg(pid, SIGQUIT);
    return retval;
}

Esse código serve para, quando o visualizador é aberto, o EP poder mostrar o menu e o usuário selecionar uma opção. Depois de selecionada a opção o visualizador é fechado.

Para fazer isso o programa usa um fork(), que divide a execução em duas frentes. Uma delas é a que executa o visualizador e a outra mostra o menu do EP. No processo filho pid = 0, no pai o pid é igual ao id do processo filho. O setpgrp() faz com que, se a segunda frente do EP for fechada o visualizador feche também.(na verdade ele cria um grupo de processos).  o killpg (com signal SIGQUIT) é usado para terminar um grupo de processos. Com isso, depois que o usuário seleciona um opção no menu o visualizador é fechado, junto com a segunda frente de execução do programa.

O código abaixo faz a mesma coisa, mas sem usar grupos de processos:
(o execvp executa um programa no linux. o arg são os argumentos do programa. por definição, o primeiro argumento sempre é o nome do programa e o último é um \0)
(o kill envia sinais para um processo. o sinal 9 é SIGKILL, que termina um processo)
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
   
int kill(pid_t pid, int sig);

int main(){
    pid_t p;   
    char t[256];
    char *arg[] = {"gcalctool", '\0'};
    p = fork();
    if (p == 0){
        execvp("gcalctool", arg);
        exit(0);
    }else {
        printf("Digite alguma coisa para sair da calculadora do gnome:");
        scanf("%s", t);
        kill(p, 9);
    }
    return 0;
}

Eu não testei muito esse código, mas ele funciona para os testes que fiz.
Em resposta à itai Soares

Re: Dúvida sobre os esqueletos.

por Francisco Reverbel -
Como pode ter gente assustada com esta discussão sobre chamadas fork, setpgrp, killpg, execvp e kill, processos pai e filho, grupos de processos, etc., é bom eu deixar uma coisa bem clara: nenhuma dessas coisas faz parte da matéria de MAC0110! Como eu disse no enunciado do EP4, o código que faz a  visualização de uma imagem e a leitura da próxima opção acontecerem em paralelo (e, ao mesmo tempo, faz com que a escolha da próxima opção feche a janela do visualizador) é bem curto, mas envolve conceitos que fogem ao escopo desta disciplina. Vocês vão aprender tudo sobre processos e sobre as chamadas fork/kill/exec/... no devido tempo. O código que usa essas coisas está na função run_viewer_and_get_option do arquivo esqueleto2.c. Vocês não são obrigados a usar essa função. Quem preferir, pode basear seu programa na outra versão do esqueleto. (Essa sim, deve ser completamente entendida.) Quem optar pelo esqueleto2.c não é obrigado a entender os detalhes internos da função run_viewer_and_get_option.

Claro que o objetivo deste comentário não é censurar a discussão (muito interessante, por sinal!) e a troca de informações sobre processos e sobre as funções do Unix/Linux que criam ou manipulam processos. Quero apenas esclarecer que nada disso faz parte da matéria de MAC0110 e, portanto, ninguém é obrigado a saber essas coisas a esta altura.

O conceito de processo é bastante profundo. Quem quisar se adiantar e aprender um pouco sobre processos agora, ótimo. Mas sugiro que não gaste tempo demais, pois mais para a frente no BCC vocês terão condições muito melhores para realmente entender o conceito.