22
Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello World 3 vezes */ #include <stdio.h> #include <string.h> #include <sys/types.h> #include <stdlib.h> #include <unistd.h> char cptr = “Hello World\n”; /* Static */ char buffer1[25]; main(void) { void showit( char * ); /* protótipo de função */ int i = 0; /* variável automática */ strcpy( buffer1, “Uma demonstração\n”); /* função de biblioteca */ write( 1, buffer1, strlen(buffer1)+1 ); /* chamada de sistema */ for ( ; i < 3; ++i ) showit(cptr); /* chamada de função */ } void showit( char *p) { char *buffer2; if ( (buffer2=(char *) malloc((unsigned) (strlen(p)+1))) != NULL) { strcpy( buffer2, p); /* copia string */ printf(“%s”,buffer2); /* mostra string */ free( buffer2 ); /* libera espaço */ } else { printf(“erro de alocação.\n”); exit(1); } }

Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Embed Size (px)

Citation preview

Page 1: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc).  /** Mostra Hello World 3 vezes*/#include <stdio.h>#include <string.h>#include <sys/types.h>#include <stdlib.h>#include <unistd.h> char cptr = “Hello World\n”; /* Static */char buffer1[25]; main(void) {

void showit( char * ); /* protótipo de função */int i = 0; /* variável automática */strcpy( buffer1, “Uma demonstração\n”); /* função de biblioteca */write( 1, buffer1, strlen(buffer1)+1 ); /* chamada de sistema */for ( ; i < 3; ++i ) showit(cptr); /* chamada de função */

}voidshowit( char *p) {

char *buffer2;if ( (buffer2=(char *) malloc((unsigned) (strlen(p)+1))) != NULL) {

strcpy( buffer2, p); /* copia string */printf(“%s”,buffer2); /* mostra string */free( buffer2 ); /* libera espaço */

} else {printf(“erro de alocação.\n”);exit(1);}

}

Page 2: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

http://www.linux.org/http://unixhelp.ed.ac.uk/http://www.cs.cf.ac.uk/Dave/C/CE.htmlhttp://www.strath.ac.uk/IT/Docs/Ccourse/http://www.dca.fee.unicamp.br/~ricarte/ProgSist/node122.htmlhttp://www.softpanorama.org/Internals/unix_system_calls_links.shtmlhttp://www.cplusplus.com/doc/tutorial/http://www.intap.net/~drw/cpp/

Page 3: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Funções de B ib lioteca e Cham adas de S istem a

Programaexecutável

C hamada desistema

Função debib lio teca

NúcleoUnix

Interface dosistema

M anual do sistem a

• Seções1. C om andos2. C ham adas de sistem a3. Funções de b iblioteca

Page 4: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Quadro-Resumo

Função sleep 3

Cabeçalho <unistd.h>

Protótipo unsigned sleep ( unsigned seconds ) ;

sucesso fracasso errno?Retorno

(a) 0, se acordado no tempo estipulado(b) tempo restante, se acordado por sinal

- não

Page 5: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função perror 3

Cabeçalho <stdio.h>

Protótipo void perror (char *s ) ;

sucesso fracasso errno?Retorno

- - não

#include <fcntl.h>extern int errno;main () { if (open ("/etc/passwd", O_RDWR) == -1) perror ("main"); else printf ("Tenho superpoderes - Posso alterar/etc/passwd.\n");}

shell> a.outmain: Permission denied

Page 6: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

O Unix utiliza dois conjuntos de identificadores de usuário, real e efetivo.

Os identificadores reais UID e GID encontram-se no arquivo de password na entrada referente a cada usuário (campos 4 e 5). O segundo conjunto é o efetivo EUID e EGID.

O sistema utiliza o real para identificar o usuário para coisas como: contabilidade e envio de e-mail, enquanto que o efetivo é usado para determinar que permissões (acesso a arquivos) adicionais devem ser garantidas ao processo, quando o usuário deste processo precisa acessar/modificar arquivos privilegiados (arquivo de password).

Para isto o Unix oferece um conjunto de permissões adicionais (SUID, SGID) que podem ser especificadas pelo dono do arquivo. Estas indicações fazem com que o SO, quando executar o programa, permita ao processo os mesmos privilégios do dono/grupo do programa. Ou seja, o EUID para o processo é aquele indicado para o dono do arquivo.

Page 7: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função getuid, geteuid, getgid, getegid 2

Cabeçalho <sys/types.h><unistd.h>

Protótipo uid_t getuid ( void ) ; uid_t geteuid ( void );

uid_t getgid ( void ) ; uid_t getegid ( void );

sucesso Fracasso errno?Resultado

identificação do processo chamador -1 sim

Page 8: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Arquivos

O sistema também prove um conjunto de informações referentes ao sistema de arquivos e aos arquivos propriamente ditos.

No caso do sistema de arquivos, associado a cada arquivo aberto existe um valor inteiro (apontador do descritor) usado pelo sistema como índice de uma tabela de descritores de arquivos (64 entradas) que esta localizada na u-area.

Esta tabela (por processo) faz referência a uma tabela de arquivos do sistema (global) que por sua vez referencia a uma tabela de i-nodes do sistema (figura ).

Referente a informações sobre os arquivos, existem algumas chamadas de sistema que são usadas com este propósito (stat, lstat, fstat). Neste caso, dado um nome de arquivo path a função stat retorna uma estrutura de informações sobre o mesmo.

Page 9: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

struct stat {

mode_t st_mode; /* tipo e modo (permissões) */

ino_t st_ino; /* i-node */

dev_t st_dev; /* numero do dispositivo */

dev_t st_rdev; /* dispositivo arquivos especiais */

nlink_t st_nlink; /* numero de links */

uid_t st_uid; /* UID do dono */

gid_t st_gid; /* GID do dono */

off_t st_size; /* tamanho em bytes */

time_t st_atime; /* ultimo acesso */

time_t st_mtime; /* ultima modificação */

time_t st_ctime; /* ultima mudança de estado */

long st_blksize; /* melhor tamanho de bloco */

long st_blocks; /* blocos (512b) alocados */

};

Page 10: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função stat, lstat, fstat 2

Cabeçalho <sys/types.h><sys/stat.h>

Protótipoint stat ( const char *path, struct stat *buf ) ;int lstat ( const char *path struct stat *buf );int fstat ( int fildes, struct stat *buf);

sucesso fracasso errno?Resultado

0 -1 sim

Page 11: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função chmod, fchmod 2

Cabeçalho <sys/types.h><sys/stat.h>

Protótipo int chmod ( const char *path, mode_t mode ) ;int fchmod ( int fildes, mode_t mode );

sucesso fracasso errno?Resultado

0 -1 sim

Com respeito as permissões de acesso aos arquivos existem também chamadas de sistema (chmod, fchmod) que permitem mudar o modo de acesso. A função chmod utiliza o arquivo especificado e a função fchmod utiliza um arquivo já aberto. A mudança de modo de acesso é permitida se o EUID do processo for igual ao dono do arquivo ou se o processo tem permissões de super-usuário.

Page 12: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Outras funções de biblioteca permitem ao programa modificar outros atributos dos arquivos (umask, getcwd, chdir, fchdir). A função umask atribui ao processo uma máscara de criação de arquivos. A função getcwd retorna caminho do diretório corrente, para isto é necessário um parâmetro buff que vai conter o nome. As funções chdir e fchdir são usadas para mudar o diretório corrente para um especificado.

Page 13: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função umask 2

Cabeçalho <sys/types.h><sys/stat.h>

Protótipo mode_t umask( mode_t cmask );

Sucesso fracasso errno?Resultado

Valor anterior da mascara

Page 14: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função Getcwd 3c

Cabeçalho <unistd.h>

Protótipo Extern char *getcwd ( char *buf, size_t size );

sucesso Fracasso errno?Resultado

Apontador para o nome do diretório corrente NULL sim

Page 15: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função Chdir, fchdir 2

Cabeçalho <unistd.h>

Protótipo int chdir ( const char *path );

int fchdir ( int fildes );

Sucesso fracasso errno?Resultado

0 -1 sim

Page 16: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função Ulimit 2

Cabeçalho <ulimit.h>

Protótipo long ulimit( int cmd, /* long newlimit */ );

Sucesso fracasso errno?Resultado

Inteiro longo não negativo -1 Sim

Recurso 

É possível obter informações sobre os limites de um processo no que diz respeito a recursos. No caso da obtenção desta informação via interface de usuário existe um comando limit que mostra os limites do sistema ( limit –h) ou processo corrente (limit). Estas informações também podem ser usadas por um processo no ambiente de programação através de chamada de sistema e funções de biblioteca (ulimit, getrlimit, setrlimit).

Page 17: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função Getrlimit, setrlimit 2

Cabeçalho <sys/time.h><sys/resource.h>

Protótipo int getrlimit ( int resource, struct rlimit *rlp );

int setrlimit ( int resource, const struct rlimit *rlp );

Sucesso fracasso errno?Resultado

0 -1 sim

Page 18: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Linha de Comando

 

Parte do ambiente de processamento para os processos são valores passados para o processo na função main. Estes valores podem vir da linha de comando ou pela chamada de sistema exec. Os valores são armazenados/referenciados por um array de apontadores conhecido como argv. O número de elementos neste array é informado por um valor inteiro referenciado por argc. É possível para o programa verificar o conteúdo da linha de comando através de uma função de biblioteca (getopt).

Page 19: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

A r g u m e n t o s d a L i n h a d e C o m a n d o

• E x e m p lo

# in c lu d e < s t d io . h >m a in ( in t a r g c , c h a r * a r g v [ ] ) { i n t i ; f o r ( i = 0 ; i < a r g c ; i+ + ) p r in t f ( " % s \ n " , * a r g v + + ) ;}

s h e l l> a .o u t a r g 1 a r g 2 a r g 3a . o u ta r g 1a r g 2a r g 3

a r g c a r g v

" a . o u t "4

" a r g 1 "

" a r g 2 "

" a r g 3 "

N U L L

Page 20: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função Getopt 2

Cabeçalho <stdlib.h>

Protótipoint getopt( int argc, char **argv, char *optstring );extern char *optarg;extern int optind, opterr;

Sucesso fracasso errno?Resultado

Próxima opção (letra) -1 ou ?

Page 21: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

Função getenv 3c

Cabeçalho <stdlib.h>

Protótipo char *getenv( char *name );

Sucesso fracasso errno?Resultado

Ponteiro para o ambiente NULL

Variáveis do ambiente

Cada processo também tem acesso a uma lista de variáveis de ambiente que também são armazenadas/referenciadas por um array de caracteres. O acesso a estas variáveis via programa é feito através de um ponteiro externo environ ( extern char **environ). Algumas funções de biblioteca estão disponíveis para manipular estas variáveis (getenv, putenv).

Page 22: Introdução de um programa no sistema, mostrando a interação com o sistema (programa 1.1). Utilização do compilador/ligador (cc – gcc). /* * Mostra Hello

#include <stdio.h>#include <stdlib.h>main () { char *pva; /* Ponteiro para as Variaveis de Ambiente */ pva = getenv ("HOME"); printf ("HOME=%s\n", pva == NULL ? "variavel naoencontrada" : pva);}

shell> a.outHOME=/home/alfa