Está en la página 1de 16

Introducci

on a Linux/C
Edgar Andr
es Margffoy Tuay

201412566

David Ernesto Parra Daza

201412828

Carlos Alfredo Martinez Hern


andez

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

En primer lugar, se proceder


a a identificar comandos basicos en una sesion de terminal de bash,
a partir del uso de ls, pwd, cd, chmod, mkdir y cat, con el fin de determinar una relacion entre
las operaciones normales que un usuario realiza en una interfaz grafica (GUI) y los comandos que
realizan las operaciones normales.
A continuaci
on, se procedi
o a la compilacion de un Hello World basado en C, usando el compilador GCC1 , as como un programa que hace uso de las funciones basicas de entrada y salida
(I/O) determinadas por la librera stdio.h.
Finalmente, se analizar
a el comportamiento de un servidor TCP usando sockets, implementado
en C.

2.

Introducci
on

2.1.

Entradas Est
andar

Las entradas est


andar corresponden a los canales de comunicacion de entrada y salida entre un
programa y su entorno en el momento en el cual inicia la ejecucion. Las tres conexiones de Entrada
y Salida se denominan: Salida Est
andar (stdout), Entrada Estandar (stdin) y Error Estandar
(stderr). Estas entradas abstraen el concepto de salida e ingreso de texto a un programa usando
un terminal de texto virtual. Por ejemplo, si un programa imprime en la consola virtual, hace uso de
la Entrada Est
andar, si solicita ingreso de informacion a traves de la consola (e.g., rm, mv, grep),
lo realiza directamente desde la Entrada Estandar, finalmente, si el programa requiere mostrar
alg
un mensaje de error o de diagn
ostico, lo realiza a traves de la salida estandar.
Terminal
stdi
n

Programa

stdout

>_
stderr

Figura 1: Representaci
on gr
afica de las relaciones entre las Entradas Est
andar

2.2.

GNU Coreutils/BusyBox

Se define como el conjunto de aplicaciones de control de archivos, texto y de consola definido


por GNU. Este paquete contiene las herramientas basicas que definen a un sistema UNIX o NIX.
BusyBox es otra colecci
on que contiene las mismas herramientas, enfocado a dispositivos moviles
1 http://gcc.gnu.org/

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

Cambia la propiedad de un archivo


Cambia los permisos de acceso de
un archivo

echo
pwd

Borra un archivo o un directorio


(Usando -rf)
Concatena las lineas de un archivo y las muestra en la Salida
Estandar (sysout)
Imprime una cadena de texto
Imprime el directorio actual

sleep

Espera un tiempo determinado

uname

Imprime la informacion del sistema

who
whoami

Imprime los usuarios existentes


Imprime el nombre de usuario
actual

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

Tabla 1: Algunos comandos disponibles en el paquete Coreutils/Busybox

2.3.

GCC

El GNU Compiler Collection corresponde a una coleccion de compiladores de diversos lenguajes


de programaci
on de c
odigo libre, ademas de la implementacion de las libreras basicas para cada
uno de estos lenguajes (e.g., glibc, libstdc++, etc.)
2.4.

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

Es un programa que provee las herramientas necesarias para facilitar la comprension de un


lenguaje de computaci
on a un programador, dando as un marco de trabajo amigable. Algunos
2 Tomado

de los man pages para cada comando

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

Es un sistema de llamadas para las operaciones de salida y entrada de dispositivos especficos y


de operaciones que no se pueden desarrollar mediante el sistema de llamadas regular. Para esto, es
necesario que el primer argumento sea un descriptor del fichero abierto, el segundo es un codigo de
solicitud que depende del dispositivo y el tercero es un puntero de memoria sin tipo.

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

De acuerdo al Extracto 2, el sistema operativo actual usa la version 3.13.0-37 del n


ucleo de
Linux, construido el 22 de Septiembre a las 21:38h (UTC), su objetivo es un sistema operativo de
64bits y el sistema operativo es Ubuntu. A continuacion en el Extracto 3, es posible apreciar que el
sistema ha usado 6Gb de memoria fsica de 8Gb totales, con una disponibilidad de 2Gb. Asmismo,
es posible apreciar que 3Gb de los 6Gb usados corresponden a procesos activos del sistema, mientras
que 1Gb corresponden a procesos activos, ahora bien, los 3Gb restantes se encuentran en uso por
parte de procesos an
onimos no visibles por el usuario, los cuales ocupan 2Gb (Procesos anonimos
activos) y 1Gb (Procesos An
onimos inactivos), respectivamente. Finalmente, es posible apreciar
que el archivo de paginaci
on (swap), con un espacio disponible de 2Gb, se encuentra inactivo.
A partir de la informaci
on descrita por el Extracto 4, es posible concluir que existen 24 procesos que comparten un espacio de memoria de paginacion, ubicado en la direccion 0x00000000,
mientras que el proceso restante, hace uso del sector 0xcbc384f8. En el Extarcto 5, es posible
apreciar la existencia de diversos procesos suspendidos por inactividad, debido a su aparicion entre
corchetes, cabe se
nalar la existencia del proceso /sbin/init como el primer proceso ejecutado en
el inicio del sistema. Finalmente, conforme a la informacion del Extracto 6 es posible concluir que
el sistema posee un bloque l
ogico dividido en seis particiones, la raz tiene identificador sda, y sus
particiones numeradas de 1 a 6.

Introducci
on a Linux/C

andfoy@andfoy1:~$ cat /proc/meminfo


MemTotal:
8060232 kB
MemFree:
2620928 kB
Buffers:
189996 kB
Cached:
2192960 kB
SwapCached:
0 kB
Active:
3542796 kB
Inactive:
1591784 kB
Active(anon):
2755956 kB
Inactive(anon):
529808 kB
Active(file):
786840 kB
Inactive(file): 1061976 kB
Unevictable:
48 kB
Mlocked:
48 kB
SwapTotal:
1998844 kB
SwapFree:
1998844 kB
Dirty:
232 kB
Writeback:
0 kB
AnonPages:
2751836 kB
Mapped:
414836 kB
Shmem:
534124 kB
Slab:
167204 kB
SReclaimable:
128312 kB
SUnreclaim:
38892 kB
KernelStack:
4512 kB
PageTables:
45684 kB
NFS_Unstable:
0 kB
Bounce:
0 kB
WritebackTmp:
0 kB
CommitLimit:
6028960 kB
Committed_AS:
7076608 kB
VmallocTotal:
34359738367 kB
VmallocUsed:
355792 kB
VmallocChunk:
34359371740 kB
HardwareCorrupted:
0 kB
AnonHugePages:
694272 kB
HugePages_Total:
0
HugePages_Free:
0
HugePages_Rsvd:
0
HugePages_Surp:
0
Hugepagesize:
2048 kB
DirectMap4k:
67772 kB
DirectMap2M:
8204288 kB

Extracto 3: Memoria fsica disponible en el sistema

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

Extracto 4: Segmentos de memoria de paginaci


on compartidos por algunos procesos

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]

Extracto 5: Procesos en ejecuci


on

Introducci
on a Linux/C

andfoy@andfoy1:/dev$ ls -al sda* tty*


brw-rw---- 1 root disk
8, 0 oct 19 16:47 # sda
brw-rw---- 1 root disk
8, 1 oct 19 16:47 # sda1
brw-rw---- 1 root disk
8, 2 oct 19 16:47 # sda2
brw-rw---- 1 root disk
8, 3 oct 19 16:47 # sda3
brw-rw---- 1 root disk
8, 5 oct 19 16:47 # sda5
brw-rw---- 1 root disk
8, 6 oct 19 16:47 # sda6
crw-rw-rw- 1 root tty
5, 0 oct 19 16:47 # tty
crw--w---- 1 root tty
4, 0 oct 19 16:47 # tty0
crw-rw---- 1 root tty
4, 1 oct 19 16:47 # tty1
crw--w---- 1 root tty
4, 10 oct 19 16:47 # tty10
crw--w---- 1 root tty
4, 11 oct 19 16:47 # tty11
crw--w---- 1 root tty
4, 12 oct 19 16:47 # tty12
crw--w---- 1 root tty
4, 13 oct 19 16:47 # tty13
crw--w---- 1 root tty
4, 14 oct 19 16:47 # tty14
crw--w---- 1 root tty
4, 15 oct 19 16:47 # tty15
crw--w---- 1 root tty
4, 16 oct 19 16:47 # tty16
crw--w---- 1 root tty
4, 17 oct 19 16:47 # tty17
crw--w---- 1 root tty
4, 18 oct 19 16:47 # tty18
crw--w---- 1 root tty
4, 19 oct 19 16:47 # tty19
crw-rw---- 1 root tty
4, 2 oct 19 16:47 # tty2
crw--w---- 1 root tty
4, 20 oct 19 16:47 # tty20
crw--w---- 1 root tty
4, 21 oct 19 16:47 # tty21
crw--w---- 1 root tty
4, 22 oct 19 16:47 # tty22
crw--w---- 1 root tty
4, 23 oct 19 16:47 # tty23
crw--w---- 1 root tty
4, 24 oct 19 16:47 # tty24
crw--w---- 1 root tty
4, 25 oct 19 16:47 # tty25
crw--w---- 1 root tty
4, 26 oct 19 16:47 # tty26
crw--w---- 1 root tty
4, 27 oct 19 16:47 # tty27
crw--w---- 1 root tty
4, 28 oct 19 16:47 # tty28
crw--w---- 1 root tty
4, 29 oct 19 16:47 # tty29
crw-rw---- 1 root tty
4, 3 oct 19 16:47 # tty3
crw--w---- 1 root tty
4, 30 oct 19 16:47 # tty30
crw--w---- 1 root tty
4, 31 oct 19 16:47 # tty31
crw--w---- 1 root tty
4, 32 oct 19 16:47 # tty32
crw--w---- 1 root tty
4, 33 oct 19 16:47 # tty33
crw--w---- 1 root tty
4, 34 oct 19 16:47 # tty34
crw--w---- 1 root tty
4, 35 oct 19 16:47 # tty35
crw--w---- 1 root tty
4, 36 oct 19 16:47 # tty36
crw--w---- 1 root tty
4, 37 oct 19 16:47 # tty37
crw--w---- 1 root tty
4, 38 oct 19 16:47 # tty38
crw--w---- 1 root tty
4, 39 oct 19 16:47 # tty39
crw-rw---- 1 root tty
4, 4 oct 19 16:47 # tty4
crw--w---- 1 root tty
4, 40 oct 19 16:47 # tty40
crw--w---- 1 root tty
4, 41 oct 19 16:47 # tty41
crw--w---- 1 root tty
4, 42 oct 19 16:47 # tty42
crw--w---- 1 root tty
4, 43 oct 19 16:47 # tty43
crw--w---- 1 root tty
4, 44 oct 19 16:47 # tty44
crw--w---- 1 root tty
4, 45 oct 19 16:47 # tty45
crw--w---- 1 root tty
4, 46 oct 19 16:47 # tty46
crw--w---- 1 root tty
4, 47 oct 19 16:47 # tty47
crw--w---- 1 root tty
4, 48 oct 19 16:47 # tty48
crw--w---- 1 root tty
4, 49 oct 19 16:47 # tty49
crw-rw---- 1 root tty
4, 5 oct 19 16:47 # tty5
crw--w---- 1 root tty
4, 50 oct 19 16:47 # tty50
crw--w---- 1 root tty
4, 51 oct 19 16:47 # tty51
crw--w---- 1 root tty
4, 52 oct 19 16:47 # tty52
crw--w---- 1 root tty
4, 53 oct 19 16:47 # tty53
crw--w---- 1 root tty
4, 54 oct 19 16:47 # tty54
crw--w---- 1 root tty
4, 55 oct 19 16:47 # tty55
crw--w---- 1 root tty
4, 56 oct 19 16:47 # tty56
crw--w---- 1 root tty
4, 57 oct 19 16:47 # tty57
crw--w---- 1 root tty
4, 58 oct 19 16:47 # tty58
crw--w---- 1 root tty
4, 59 oct 19 16:47 # tty59
crw-rw---- 1 root tty
4, 6 oct 19 16:47 # tty6

Extracto 6: Dispositivos disponibles en /dev/

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

Ahora bien, se defini


o un archivo makefile, con el fin de automatizar el proceso de construccion
del ejecutable binario. De acuerdo a las reglas de construccion, se definio a continuacion el siguiente
6 http://www.nano-editor.org/

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!

./ejecutable1 > log1.txt


ls
main.o
log1.txt
cat log1.txt

Extracto 11: Redirecci


on del flujo Est
andar

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

En primer lugar, se llama al preprocesador de C, el cual act


ua como un programa independiente
que suple informaci
on al compilador, en este caso, sobre la existencia de un nuevo tipo booleano, a
partir de un tipo primitivo (Int), que puede tomar dos valores, 1 si es verdadero (true) y 0 (false)
de otra forma. Posteriormente, se define una variable global, la cual puede ser modificada en todos
los bloques de c
odigo del programa y puede ser accedida por todas las funciones dentro del mismo
archivo de c
odigo fuente, difiere de una variable local, en la medida que una variable local solo puede
ser accedida dentro del alcance de un mismo bloque de codigo. C se diferencia de Java, en cuanto a
que Java es orientado a objetos y define otros niveles de visibilidad de las variables (private, public,
static, final, protected, transient, etc.). El programa en cuestion, toma informacion de la entrada
est
andar usando la funci
on scanf, la cual se encuentra definida en stdio.h, la almacena en un arreglo
de caracteres y posteriormente la imprime en la salida estandar usando printf. Debido a que recibe
entradas desde stdin, es posible enviar un archivo al programa y que este sea impreso de la misma
manera que haber escrito en el teclado de la consola.

4.

Conclsuiones

Es posible diferenciar un sistema operativo de otro, en la medida que su n


ucleo y aplicaciones
difieran o realicen operaciones distintas a nivel de gestion de recursos.
Un lenguaje compilado difiere de un lenguaje interpretado, debido a que el compilado puede
recibir datos tras ser transformado en codigo de maquina y existe un ejecutable por cada maquina
existente, mientras que en un lenguaje interpretado, los datos ingresan en tiempo de ejecucion
y se debe definir un interprete por maquina, y por lo tanto, el codigo no cambia.
De acuerdo a los objetivos de compilacion, resulta mas eficiente usar un makefile.
Finalmente, fue posible establecer la relacion entre las entradas estandar de un sistema UNIX,
bajo las cuales, toda entrada puede ser redirigida como salida, y viceversa.

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

También podría gustarte