Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción A Linux/C
Introducción A Linux/C
on a Linux/C
Edgar Andr
es Margffoy Tuay
201412566
201412828
201324611
Fundamentos de Redes
19 de octubre de 2014
Resumen
El n
ucleo de un sistema operativo, describe la interaccion y gestion de los recursos fsicos y la
interacci
on con el usuario. De acuerdo al procedimiento y las directivas establecidas por el n
ucleo,
es posible definir un conjunto de aplicaciones (Que operan sobre el n
ucleo) especficas para cada
dispositivo, conforme a las capacidades y funciones del mismo, de tal forma que extienda y emplee
de forma
optima funciones especficas de los componentes fsicos. La conjuncion entre un n
ucleo y
un conjunto de aplicaciones, se denomina Sistema Operativo, un sistema operativo difiere de otro
en la medida que su kernel y aplicaciones sean distintas.
No obstante, existen herramientas de desarrollo comunes a la mayora de Sistemas Operativos.
Estas herramientas de desarrollo, permiten interpretar directamente instrucciones de alto nivel
(Muy cercana al lenguaje natural), y transformarlas en una representacion intermedia o directamente a c
odigo de m
aquina. Toda representacion de instrucciones de operacion en alguna forma
de lenguaje comprensible por un humano, se refiere como Lenguaje de Programacion. De acuerdo
a la similitud a alguna forma de lenguaje natural o directamente a lenguaje de maquina, es posible definir lenguajes de alto nivel (Similares al lenguaje natural; e.g., Python, C, Java, Fortran,
Haskell, Lisp, ML, entre otros), o de bajo nivel (Cercanos a las instrucciones del procesador. e.g.,
Assembly). Finalmente, es posible definir dos categoras de lenguajes de alto nivel de acuerdo a su
interpretaci
on, si los programas son traducidos directamente a un ejecutable en codigo de maquina
y luego ejecutados, el lenguaje en cuestion es compilado. Por el contrario, si el lenguaje se ejecuta de forma inmediata, sin requerir alguna traduccion, se determina que es un lenguaje interpretado.
El objetivo del presente informe consiste en la identificacion de Linux como un n
ucleo de codigo libre, basado en la especificaci
on POSIX y la comprension de GNU Coreutils o BusyBox como
un conjunto de aplicaciones b
asicas que permiten que el sistema operativo sea similar a UNIX,
asmismo, el informe pretende reconocer C como un lenguaje de alto nivel compilado.
Objetivo
Reconocer las caractersticas de un sistema NIX, las aplicaciones basicas basadas en Bash y la
diferencia entre n
ucleos que cumplen con la especificacion POSIX
Identificar la operaci
on del compilador GCC, la sintaxis del lenguaje de programacion C, las
opciones disponibles y su relaci
on con las funciones del sistema operativo.
Introducci
on a Linux/C
1.
Procedimiento
2.
Introducci
on
2.1.
Entradas Est
andar
Programa
stdout
>_
stderr
Figura 1: Representaci
on gr
afica de las relaciones entre las Entradas Est
andar
2.2.
GNU Coreutils/BusyBox
Introducci
on a Linux/C
y embedidos. A continuaci
on, se encuentra una descripcion general de cada comando basico de
UNIX.2 (Tabla 1). Cada comando puede recibir uno o mas parametros de acuerdo a su funcion, por
ejemplo, ls puede obtener una expresion regular como parametro, as como cat o chmod.
chown
chmod
cp
dd
ln
ls
mkdir
mv
echo
pwd
sleep
uname
who
whoami
rm
cat
Copia un archivo
Copia y cambia el formato de un
archivo
Crea un acceso directo a un archivo
Muestra los subdirectorios y archivos de un directorio en orden
alfabetico
Crea un directorio
Mueve o renombra un archivo
2.3.
GCC
Make
Make3 es una utlilidad que de forma automatica, construye y complia programas y libreras
directamente del c
odigo fuente, al leer archivos makefile, que contienen las reglas pertinentes para
derivar el programa. A pesar de la popularidad de algunos Entornos de Desarrollo Integrados (IDE),
make a
un sigue siendo usado, especialmente en UNIX.
2.4.1.
Makefile
Un makefile describe las reglas de construccion de un programa, i.e., Cuales libreras deben ser
incluidas, que compilador debe ser usado, el orden de compilacion, creacion de objetos y enlace de
los mismos. Normalmente make se invoca al llamar los objetivos del programa.
#
make
2.5.
[TARGET ...]
IDE
3 https://www.gnu.org/software/make/
Introducci
on a Linux/C
ejemplos de IDE se pueden ver en los programas Visual Studio, Eclipse4 o NetBeans5 . Entre sus
componentes generalmente se encuentra:
Un editor de texto.
Un compilador.
Un interprete.
Un depurador.
Un cliente.
2.6.
ioctl
3.
An
alisis
En primer lugar, fue necesario listar el directorio de usuario (/home/estudiante), el cual, fue
detectado usando el comando pwd en la carpeta inicial del terminal (Conocido tambien con Alias
), posteriormente, se procedi
o a listar los archivos usando ls, debido a que no existan archivos o
directorios en ese momento, el comando no imprimio informacion alguna. Sin embargo, tras crear
una carpeta con nombre redes en el directorio de usuario y ejecutar otra vez el comando ls, el
nuevo directorio fue listado de forma satisfactoria.
estudiante@ubuntu:~$
/home/estudiante
estudiante@ubuntu:~$
estudiante@ubuntu:~$
estudiante@ubuntu:~$
#
Redes
pwd
ls
mkdir Redes
ls
Extracto 1: Ejecuci
on de pwd, ls y mkdir en el directorio de usuario
A continuaci
on, fue necesario definir los permisos de acceso del directorio recien creado (Debido
a que la distribuci
on en ese momento se encontraba sujeta a permisos de superusuario). Con el
fin de modificar los permisos definidos en el directorio, fue necesario ejecutar el comando chmod,
el cual, de acuerdo a su documentaci
on en man, configura el nivel de permisos de un archivo, este
puede variar a solo permisos de lectura, permisos de lectura y escritura, y permisos de modificacion
del sistema.
Ahora bien, tras obtener una descripcion general de los comandos basicos definidos en el paquete
Coreutils (En este caso), se procedi
o a solititar informacion sobre el sistema, tal como el espacio
de memoria usado por el sistema, la version del n
ucleo, los dispositivos y terminales disponibles,
adem
as de los procesos actuales del sistema, la informacion se recopila a continuacion.
4 https://www.eclipse.org/
5 https://netbeans.org/
Introducci
on a Linux/C
andfoy@andfoy1:~$ uname -a
Linux andfoy1 3.13.0-37-generic
"#"64-Ubuntu SMP Mon Sep 22 21:28:38
UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
Extracto 2: Versi
on del sistema operativo y el kernel actual
Introducci
on a Linux/C
Introducci
on a Linux/C
andfoy@andfoy1:~$ ipcs -m
---- Segmentos memoria compartida ---key
shmid
propietario perms
0x00000000 425984
andfoy
600
0x00000000 1835009
andfoy
600
0x00000000 1933314
andfoy
600
0x00000000 851971
andfoy
600
0x00000000 1114116
andfoy
600
0x00000000 1212421
andfoy
600
0x00000000 1245190
andfoy
600
0x00000000 1474567
andfoy
600
0x00000000 1572872
andfoy
600
0x00000000 2523145
andfoy
600
0x00000000 1638410
andfoy
600
0xcbc384f8 2129931
andfoy
600
0x00000000 4390924
andfoy
600
0x00000000 2261005
andfoy
600
0x00000000 2424847
andfoy
700
0x00000000 2588688
andfoy
600
0x00000000 7831569
andfoy
600
0x00000000 7864338
andfoy
600
0x00000000 2752531
andfoy
600
0x00000000 5406740
andfoy
600
0x00000000 2818069
andfoy
600
0x00000000 2981910
andfoy
700
0x00000000 3014679
andfoy
700
0x00000000 3538968
andfoy
600
0x00000000 3342361
andfoy
600
0x00000000 3375130
andfoy
600
0x00000000 9764891
andfoy
600
0x00000000 3964956
andfoy
600
0x00000000 9797661
andfoy
600
0x00000000 9830430
andfoy
600
0x00000000 4063263
andfoy
600
0x00000000 10321954
andfoy
700
0x00000000 8028195
andfoy
600
0x00000000 7634983
andfoy
600
0x00000000 7897129
andfoy
600
0x00000000 9175084
andfoy
600
0x00000000 9207854
andfoy
600
bytes
524288
393216
524288
524288
524288
524288
33554432
524288
524288
524288
4194304
64528
1048576
524288
4065216
2097152
524288
4194304
393216
393216
2097152
640000
4065216
1048576
524288
4194304
524288
393216
4194304
33554432
1048576
4065216
4
1048576
33554432
524288
2097152
nattch
2
2
2
2
2
2
2
2
2
2
2
1
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
estado
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
dest
Introducci
on a Linux/C
andfoy@andfoy1:~$ ps ax
PID TTY
STAT
TIME
1 ?
Ss
0:01
2 ?
S
0:00
3 ?
S
0:00
5 ?
S<
0:00
7 ?
S
0:12
8 ?
S
0:05
9 ?
S
0:06
10 ?
S
0:04
11 ?
S
0:04
12 ?
S
0:00
13 ?
S
0:00
14 ?
S
0:00
15 ?
S
0:00
16 ?
S
0:00
17 ?
S
0:00
18 ?
S
0:00
19 ?
S
0:00
20 ?
S
0:00
21 ?
S
0:00
22 ?
S
0:11
23 ?
S<
0:00
24 ?
S
0:00
25 ?
S
0:00
26 ?
S
0:00
27 ?
S
0:00
28 ?
S<
0:00
29 ?
S
0:00
30 ?
S
0:00
31 ?
S
0:00
33 ?
S<
0:00
34 ?
S<
0:00
35 ?
S
0:00
36 ?
S<
0:00
37 ?
S<
0:00
38 ?
S<
0:00
39 ?
S<
0:00
40 ?
S<
0:00
41 ?
S<
0:00
42 ?
S<
0:00
43 ?
S
0:00
44 ?
S<
0:00
45 ?
S<
0:00
46 ?
R
0:11
47 ?
S
0:00
49 ?
S
0:00
50 ?
S
0:00
51 ?
SN
0:00
52 ?
SN
0:01
53 ?
S
0:00
54 ?
S
0:00
55 ?
S<
0:00
67 ?
S<
0:00
69 ?
S
0:12
89 ?
S<
0:00
90 ?
S<
0:00
101 ?
S
0:11
143 ?
S<
0:00
144 ?
S
0:00
145 ?
S
0:00
146 ?
S
0:00
147 ?
S
0:00
148 ?
S
0:00
149 ?
S
0:00
COMMAND
/sbin/init
[kthreadd]
[ksoftirqd/0]
[kworker/0:0H]
[rcu_sched]
[rcuos/0]
[rcuos/1]
[rcuos/2]
[rcuos/3]
[rcu_bh]
[rcuob/0]
[rcuob/1]
[rcuob/2]
[rcuob/3]
[migration/0]
[watchdog/0]
[watchdog/1]
[migration/1]
[ksoftirqd/1]
[kworker/1:0]
[kworker/1:0H]
[watchdog/2]
[migration/2]
[ksoftirqd/2]
[kworker/2:0]
[kworker/2:0H]
[watchdog/3]
[migration/3]
[ksoftirqd/3]
[kworker/3:0H]
[khelper]
[kdevtmpfs]
[netns]
[writeback]
[kintegrityd]
[bioset]
[kworker/u9:0]
[kblockd]
[ata_sff]
[khubd]
[md]
[devfreq_wq]
[kworker/0:1]
[kworker/1:1]
[khungtaskd]
[kswapd0]
[ksmd]
[khugepaged]
[fsnotify_mark]
[ecryptfs-kthrea]
[crypto]
[kthrotld]
[kworker/2:1]
[deferwq]
[charger_manager]
[kworker/3:1]
[kpsmoused]
[scsi_eh_0]
[scsi_eh_1]
[scsi_eh_2]
[scsi_eh_3]
[scsi_eh_4]
[scsi_eh_5]
Introducci
on a Linux/C
Introducci
on a Linux/C
Tras analizar las caractersticas del sistema en su totalidad, se procedio a crear un archivo de
texto plano, usando nano6 como editor principal, debido a ausencia de instrucciones definidas en el
uso de vi, el cual carece de una gua comprensiva. Posteriormente, se copio este archivo en la carpeta recien creada, usando el comando mv, finalmente, se realizo una copia de esta carpeta (Usando
cp) y se procedi
o a borrar la carpeta anterior, llamando a rm con la opcion de borrado recursivo
(-rf) activada.
Posteriormente, se procedi
o a realizar un archivo de codigo de fuente en C, usando el editor nano,
debido a las ventajas que ofreca al acceso con respecto a vi, sin embargo, en el caso de sistemas
embedidos y con baja memoria, vi es superior en la medida que es de bajo peso y altamente eficiente.
Como es posible apreciar en el C
odigo Fuente 7, se realiza un llamado a las libreras stdlib.h
y stdio.h, las cuales definen las funciones basicas y de entrada y salida, respectivamente, en este
caso, se define una funci
on principal (main), la cual, debe retornar un valor entero (Exit code).
Ahora bien, cuando el c
odigo es compilado, la primera llamada se realiza directamente a main, el
cual, escribe a la Salida Est
andar la cadena de caracteres Hello World!, y luego procede a retornar
0, indicando que la ejecuci
on del programa fue correcta y satisfactoria, si el programa retornara 1,
indica que el programa fall
o en su ejecucion.
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
return 0;
}
Extracto 7: Hello World escrito en C
Tras compilar el programa usando gcc, fue posible identificar la generacion de un ejecutable con
nombre a.out, el nombre por defecto del enlazador de objetos.
estudiante@ubuntu:~/redes$ nano main.c
estudiante@ubuntu:~/redes$ gcc main.c
estudiante@ubuntu:~/redes$ ls
# a.out
main.c
redes.txt
estudiante@ubuntu:~/redes$ ./a.out
Hello World!
Extracto 8: Proceso de compilaci
on de un programa, usando GCC
10
Introducci
on a Linux/C
makefile (Extracto 9). Tras ejecutar el comando make, como se aprecia en 10, el programa ejecuta
las reglas definidas en el archivo makefile, en primer lugar, se configura la variable CC como gcc,
debido a que es el compilador a usar, posteriormente, se realiza la compilacion del programa a un
archivo de objeto, como se describe en la regla prueba1.o, posteriormente, la regla ejecutable 1,
toma el archivo objeto y lo reescribe como un ejecutable (Equivalente a a.out), con el nombre
ejecutable1. Si se realiza la acci
on make clean, se realiza un llamado a la regla clean, la cual
establece que todo archivo que finalice en o, ademas del archivo ejecutable1, debe ser eliminado.
CC = gcc
all: ejecutable1
ejecutable1: main.o
$(CC) main.o -o ejecutable1
prueba1.o: main.c
$(CC) -c main.c
clean:
rm -rf *o ejecutable1
Extracto 9: Makefile para compilar el pbjetivo descrito en el Exracto 7
estudiante@ubuntu:~/redes$ rm a.out
estudiante@ubuntu:~/redes$ make
gcc -c -o main.o main.c
gcc main.o -o ejecutable1
estudiante@ubuntu:~/redes$ ls
# ejecutable1
main.c main.o
redes.txt
estudiante@ubuntu:~/redes$ ./ejecutable1
Hello World!
estudiante@ubuntu:~/redes$ make clean
rm -rf *o ejecutable1
estudiante@ubuntu:~/redes$ ls
main.c
redes.txt
Extracto 10: Proceso de compilaci
on de un programa, usando make
Finalmente, fue posible redirigir el flujo de datos hacia la Salida Estandar realizada por el
programa y redirigirla al flujo de Entrada Estandar al escribir las lineas impresas por el programa
en un archivo llamado log.txt.
11
Introducci
on a Linux/C
estudiante@ubuntu:~/redes$
estudiante@ubuntu:~/redes$
# ejecutable1
main.c
redes.txt
estudiante@ubuntu:~/redes$
Hello World!
12
Introducci
on a Linux/C
#include <stdlib.h>
#include <stdio.h>
#ifndef bool
typedef bool;
#define true 1
#define false 0
#endif
bool leer;
/*
Declaracion de funciones
*/
//void imprimir_nombre(bool lectura);
/*
Aqu
va la documentaci
on de la funci
on
*/
void imprimir_linea(bool lectura)
{
//Variable local
char str[160];
if(lectura)
{
printf("Ingrese su nombre:\n");
scanf("%s",str);
}
else
{
printf("No se utilizo la entrada de la terminal\n");
}
//Imprime el texto le
do en la terminal
printf("\n Su nombre es:\n");
printf("%s\n",str);
}
int main(int argc, char *argv[] )
{
//Se asigna la condici
on para leer desde la terminal
leer = true;
//Se llama la funci
on para leer el texto de la terminal
imprimir_linea(leer);
return 0;
}
Extracto 12: Prueba n
umero 2: Captura de datos desde la Entrada est
andar
13
Introducci
on a Linux/C
4.
Conclsuiones
14
Introducci
on a Linux/C
Referencias
[1] Standard for information technologyportable operating system interface (posix(r)) base specifications, issue 7. IEEE Std 1003.1, 2013 Edition (incorporates IEEE Std 1003.1-2008, and IEEE
Std 1003.1-2008/Cor 1-2013), pages 13906, April 2013.
[2] Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman. Compilers: Principles,
Techniques, and Tools (2Nd Edition). Addison-Wesley Longman Publishing Co., Inc., Boston,
MA, USA, 2006.
[3] GNU Coreutils. ls - list files on a directory. http://linux.die.net/man/1/ls, March 2014.
[4] ISO. ISO/IEC 9899:2011 Information technology Programming languages C. International
Organization for Standardization, Geneva, Switzerland, December 2011.
[5] Michael Kerrisk. The Linux Programming Interface: A Linux and UNIX System Programming
Handbook. No Starch Press, San Francisco, CA, USA, 1st edition, 2010.
15
Introducci
on a Linux/C
Anexos
4.1.
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
history
cd Assets/
make
ls
./ejecutable1
ls
make
make clean
make
ls
make clean
make
make clean
make
clear
make clean
make
history
cd ..
cd Proofs/
cd
cd ~/Documentos/2014/II\ Semestre/Redes/Laboratorio/Lab\ 5
cd Proofs/
cd P
ls
cd Redes/
ls
cd Prueba\ 2/
ls
gcc prueba2.c
ls
./a.out
./a.out a
./a.out 666
./a.out
gcc prueba2.c
./a.out
gcc prueba2.c
./a.out
./a.out < "aaa"
./a.out < echo aaa
./a.out < a
./a.out
echo Edgar A. Margffoy > nombre.txt
cat nombre.txt
./a.out < nombre.txt
gcc prueba2.c
./a.out < nombre.txt
16
./a.out
history