<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Sessi%C3%B3_4_curs_programaci%C3%B3_linux</id>
	<title>Sessió 4 curs programació linux - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Sessi%C3%B3_4_curs_programaci%C3%B3_linux"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Sessi%C3%B3_4_curs_programaci%C3%B3_linux&amp;action=history"/>
	<updated>2026-08-30T14:13:43Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Sessi%C3%B3_4_curs_programaci%C3%B3_linux&amp;diff=496&amp;oldid=prev</id>
		<title>Joan: New page: Sessió 4. Programació en C. 9 de maig del 2008  ==============================================      $ aptitude install manpages-dev    Funcions del nucli per gestionar els fitxers: int  ...</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Sessi%C3%B3_4_curs_programaci%C3%B3_linux&amp;diff=496&amp;oldid=prev"/>
		<updated>2008-11-09T01:00:51Z</updated>

		<summary type="html">&lt;p&gt;New page: Sessió 4. Programació en C. 9 de maig del 2008  ==============================================      $ aptitude install manpages-dev    Funcions del nucli per gestionar els fitxers: int  ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Sessió 4. Programació en C. 9 de maig del 2008&lt;br /&gt;
&lt;br /&gt;
==============================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$ aptitude install manpages-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funcions del nucli per gestionar els fitxers: int&lt;br /&gt;
&lt;br /&gt;
open, int creat, ssize_t read, ssize_t write, off_t&lt;br /&gt;
&lt;br /&gt;
lseek, int unlink&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En Unix, tot són fitxers. Per exemple, si volem llegir&lt;br /&gt;
&lt;br /&gt;
un scanner farem un read, si volem escriure en una&lt;br /&gt;
&lt;br /&gt;
impressora farem un write, i amb el open obrirem (o&lt;br /&gt;
&lt;br /&gt;
associarem) el scanner o la impressora.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des del campus virtual, baixem el fitxer exemples.tgz,&lt;br /&gt;
&lt;br /&gt;
i el descomprimim a /exemples&lt;br /&gt;
&lt;br /&gt;
$ mkdir exemples&lt;br /&gt;
&lt;br /&gt;
$ mv exemples.tgz exemples/&lt;br /&gt;
&lt;br /&gt;
$ cd exemples0&lt;br /&gt;
&lt;br /&gt;
$ tar zxf exemples.tgz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
exemple copia.c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
assert.h -&amp;gt; em diu que la constant EXIT_SUCCESS és 0&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char **argv)  -&amp;gt; comptador&lt;br /&gt;
&lt;br /&gt;
d'argumens i arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
en el man em diu, quan vull fer servir una cosa com el&lt;br /&gt;
&lt;br /&gt;
open, quins includes he de fer servir&lt;br /&gt;
&lt;br /&gt;
copia.c necessita com a mínim 3 arguments: el&lt;br /&gt;
&lt;br /&gt;
programa, fitxer origen i fitxer destí&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O_WRONLY|O_CREAT|O_TRUNC -&amp;gt; OR bit a bit. Aquestes&lt;br /&gt;
&lt;br /&gt;
constants són potències de 2&lt;br /&gt;
&lt;br /&gt;
|| és un OR entre variables, i | és un or bit a bit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
els canals estàndard d'entrada, sortida i error no&lt;br /&gt;
&lt;br /&gt;
necessiten orbrir-se&lt;br /&gt;
&lt;br /&gt;
write(STDERR_FILENO,&amp;quot;fitxer no existent\n&amp;quot;,19); -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
envia el missatge d'error al canal estàndard d'error.&lt;br /&gt;
&lt;br /&gt;
Li hem de dir el número de caràcters a enviar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per provar el fitxer:&lt;br /&gt;
&lt;br /&gt;
gcc -o copia copia.c -&amp;gt; es crea l'executable copia. El&lt;br /&gt;
&lt;br /&gt;
binari és especificat pel paràmetre -o. Fa el&lt;br /&gt;
&lt;br /&gt;
preprocessat, compilació, ensamblatge, i vinculació&lt;br /&gt;
&lt;br /&gt;
(linkatge). &lt;br /&gt;
&lt;br /&gt;
http://www.snoether.com/doc/gcc.html&lt;br /&gt;
&lt;br /&gt;
arguments de gcc:&lt;br /&gt;
&lt;br /&gt;
http://www.snoether.com/doc/gcc2.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
per crear un fitxer, fer per exemple:&lt;br /&gt;
&lt;br /&gt;
$ cat &amp;gt; fitxer1.txt&lt;br /&gt;
&lt;br /&gt;
vaig escrivint, i per acabar, Ctrl-C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per executar-lo:&lt;br /&gt;
&lt;br /&gt;
$ ./copia fitxer1.txt fitxer2.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si falla la compilació, no trova els include, instalar&lt;br /&gt;
&lt;br /&gt;
libc6-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si volem estalviar-nos el ./, recordar de fer&lt;br /&gt;
&lt;br /&gt;
PATH = $PATH&amp;quot;:.&amp;quot; -&amp;gt; afegim el . en el PATH, que&lt;br /&gt;
&lt;br /&gt;
representa el directori actual&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
0666 -&amp;gt; read, write, no execute (6) per a usuari, grup&lt;br /&gt;
&lt;br /&gt;
i altres&lt;br /&gt;
&lt;br /&gt;
open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666) -&amp;gt; té 3&lt;br /&gt;
&lt;br /&gt;
arguments, encara que l'especificació de open només en&lt;br /&gt;
&lt;br /&gt;
tenia 2. Això és perquè C és un gamberro, segons el&lt;br /&gt;
&lt;br /&gt;
Josep, que no considera que sigui un bon llenguatge de&lt;br /&gt;
&lt;br /&gt;
programació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$ gcc copia.c -&amp;gt; sempre crea el fitxer a.out, que és&lt;br /&gt;
&lt;br /&gt;
el binari-executable. Si el que vull és elegir el nom&lt;br /&gt;
&lt;br /&gt;
del binari, faig servir el paràmetre -o: gcc copia.c&lt;br /&gt;
&lt;br /&gt;
-o copia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple de llistes enllaçades que he trobat a&lt;br /&gt;
&lt;br /&gt;
Internet:&lt;br /&gt;
&lt;br /&gt;
http://www.infor.uva.es/~benja/ejercicioC-2.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
      main (int argc, char *argv[])&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
      DIR *pdir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      struct dirent *dp;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      /* Comprobación de que se pasa el número&lt;br /&gt;
&lt;br /&gt;
correcto de argumentos */&lt;br /&gt;
&lt;br /&gt;
      if (argc != 2) {&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;Uso: %s nombre_directorio\n&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
argv[0]);&lt;br /&gt;
&lt;br /&gt;
        exit (1);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      /* Se abre el directorio */&lt;br /&gt;
&lt;br /&gt;
      pdir = opendir(argv[1]);&lt;br /&gt;
&lt;br /&gt;
      if (pdir == NULL) {&lt;br /&gt;
&lt;br /&gt;
        perror(&amp;quot;error en opendir.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        exit(1);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      /* Lectura adelantada para los elementos del&lt;br /&gt;
&lt;br /&gt;
directorio */&lt;br /&gt;
&lt;br /&gt;
      dp = readdir(pdir);&lt;br /&gt;
&lt;br /&gt;
      while(dp != NULL) {&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s\n&amp;quot;, dp-&amp;gt;d_name);&lt;br /&gt;
&lt;br /&gt;
        dp = readdir(pdir);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      /* Ya no hay más ficheros y por lo tanto se&lt;br /&gt;
&lt;br /&gt;
cierra el directorio */&lt;br /&gt;
&lt;br /&gt;
      closedir(pdir);&lt;br /&gt;
&lt;br /&gt;
      exit(0);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple amb senyals (en Bash):&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
crear el fitxer prova:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function accio1 {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;senyal 1 rebut(SIGHUP)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
trap accio 1&lt;br /&gt;
&lt;br /&gt;
while true&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
per executar.lo: chmod +x prova&lt;br /&gt;
&lt;br /&gt;
./prova &amp;amp; -&amp;gt; em diu quin és el número del procés&lt;br /&gt;
&lt;br /&gt;
(6728), i comença a funciona. Cada 5 segons escriu un&lt;br /&gt;
&lt;br /&gt;
'.'&lt;br /&gt;
&lt;br /&gt;
per acabar, s'ha de matar el procés:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
kill -1 6728&lt;br /&gt;
&lt;br /&gt;
kill -9 6728&lt;br /&gt;
&lt;br /&gt;
(veure la diferència, repassar!!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
prova2:&lt;br /&gt;
&lt;br /&gt;
function accio1 {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;senyal 1 rebut(SIGHUP)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot; Tanquem els fitxers si en tenim.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
trap accio 1&lt;br /&gt;
&lt;br /&gt;
while true&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mirar tot el tema de senyals!!&lt;br /&gt;
&lt;br /&gt;
copsa-ctrlc.c&lt;br /&gt;
&lt;br /&gt;
SIGINT: Ctrl-C&lt;br /&gt;
&lt;br /&gt;
fflush(stdout) -&amp;gt; buida el buffer associat al canal&lt;br /&gt;
&lt;br /&gt;
estàndard de sortida&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; amb CTRL-C no podem aturar el programa. Hem&lt;br /&gt;
&lt;br /&gt;
d'enviar un kill -9 des d'un altre terminal, o tambe&lt;br /&gt;
&lt;br /&gt;
el puc aturar amb Ctrl-Z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
usa-alarmes: en compilar-ho surt un warning en el&lt;br /&gt;
&lt;br /&gt;
gets. Ens està avisant de què hi ha problemes de&lt;br /&gt;
&lt;br /&gt;
seguretat en l'ús del gets.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comunicació entre processos. Programació concurrent&lt;br /&gt;
&lt;br /&gt;
(programació d'una pipe)&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fork(), de forquilla. El que fa és crear un procés&lt;br /&gt;
&lt;br /&gt;
idèntic. Hereda tot l'entron del procés que l'està&lt;br /&gt;
&lt;br /&gt;
creant.&lt;br /&gt;
&lt;br /&gt;
Concepte de procés pare i procés fill&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Taula de descripció de fitxers. Quan faig un open&lt;br /&gt;
&lt;br /&gt;
fitxer, el que retorna és l'index d'aquesta taula.&lt;br /&gt;
&lt;br /&gt;
En aquesta taula, els 3 primers index estan ocupats&lt;br /&gt;
&lt;br /&gt;
pel stdin (0), stdout (1) i stderr(2). Per tant, quan&lt;br /&gt;
&lt;br /&gt;
faig un open, allò normal és que retorni un '3'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
f1=open(&amp;quot;fitxer1&amp;quot;, O_RDONLY); -&amp;gt; ocupa la posició 3&lt;br /&gt;
&lt;br /&gt;
f2=open(&amp;quot;fitxer1&amp;quot;, O_RDONLY); -&amp;gt; ocupa la posició 4&lt;br /&gt;
&lt;br /&gt;
f3=dup(f1); -&amp;gt; duplicar una entrada a la taula.&lt;br /&gt;
&lt;br /&gt;
Duplica en la primera posició que trobi lliure.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; ocupa la posició 5. Això vol dir que per llegir el&lt;br /&gt;
&lt;br /&gt;
fitxer 1 puc fer servir els descriptors 3 ó 5.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El pipe() crea dos descriptors de fitxers: un per&lt;br /&gt;
&lt;br /&gt;
entrada de fitxer, i un per sortida.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mirar les transparències, i veure com he aconseguit la&lt;br /&gt;
&lt;br /&gt;
connexió del pipe entre el pare i el fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple de pipe: ordenació per selecció. (min.c)&lt;br /&gt;
&lt;br /&gt;
----------------&lt;br /&gt;
&lt;br /&gt;
és necessari els binaris min (que fa el procés&lt;br /&gt;
&lt;br /&gt;
d'ordenació) i present (que mostra la sortida per&lt;br /&gt;
&lt;br /&gt;
pantalla)&lt;br /&gt;
&lt;br /&gt;
per tal de què funcioni:&lt;br /&gt;
&lt;br /&gt;
$ echo &amp;quot;3 2 1 -1 -1 &amp;quot; | ./min | ./min | ./present&lt;br /&gt;
&lt;br /&gt;
o bé&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;30 50 12 67 42 -1 -1 -1 -1&amp;quot; | ./min | ./min |&lt;br /&gt;
&lt;br /&gt;
./min | ./min | ./present&lt;br /&gt;
&lt;br /&gt;
el -1 fa de sentinella, que significa que un cop&lt;br /&gt;
&lt;br /&gt;
finalitzat el procés d'ordenació, es va passant el&lt;br /&gt;
&lt;br /&gt;
resultat al final, doncs l'últim procés és l'únic que&lt;br /&gt;
&lt;br /&gt;
té el canal de sortida i pot visualitzar el resultat.&lt;br /&gt;
&lt;br /&gt;
El pare té el stdin, i el fill té el stdout&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
exemple de pipe: programa tub&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
al revés que abans, El pare té el stdout, i el fill té&lt;br /&gt;
&lt;br /&gt;
el stdin&lt;br /&gt;
&lt;br /&gt;
./tub /bin/ls /bin/more -&amp;gt; té el mateix efecte que ls&lt;br /&gt;
&lt;br /&gt;
| more&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
parlo i escolto. Missatges&lt;br /&gt;
&lt;br /&gt;
--------------------------&lt;br /&gt;
&lt;br /&gt;
$ touch recull&lt;br /&gt;
&lt;br /&gt;
Forma d'ús:&lt;br /&gt;
&lt;br /&gt;
en dos terminals, en un executo ./parlo i en l'altre&lt;br /&gt;
&lt;br /&gt;
./escolto&lt;br /&gt;
&lt;br /&gt;
aleshores en un escric una línia, i la veig en l'altre&lt;br /&gt;
&lt;br /&gt;
terminal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
semàfors&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
&lt;br /&gt;
POSIX: creació de fils de control&lt;br /&gt;
&lt;br /&gt;
filsuma -&amp;gt; mostra la concurrència en la variable&lt;br /&gt;
&lt;br /&gt;
filsuma2 -&amp;gt; sempre funciona&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>