lint
lint
malloc
permet d'allouer des objets dynamiques dans le tas
(le heap de Pascal).
typedef
autorise de nouveaux types
typedef int Length; Lenth x, y[30];
typedef struct tnode *Treeptr; typedef struct tnode { char *word; int count; Treeptr left; Treeptr right; } Treenode;
lint
est un programme qui permet de faire des vérifications
intermodules en C. Bien utile parfois pour trouver des erreurs de type.
En principe, moins nécessaire avec C ANSI.
shmget
, shmat
opérations Système V.
int shmid; main() { int i, *pint; char *addr1, *addr2; extern char *shmat(); shmid = shmget(75, 128*1024, 0777|IPC_CREAT); addr1 = shmat(shmid, 0, 0); addr2 = shmat(shmid, 0, 0); printf ("addr1 0x%x, addr2 0x%x\n", addr1, addr2); pint = (int *) addr1; for (i = 0; i < 256; i++) *pint++ = i; *pint = 256; pint = (int *) addr2; for (i = 0; i < 256; i++) print ("index %d, value %d\n", i, *pint++); pause(); }
shmget
, shmat
opérations Système V.
int shmid; main() { int i, *pint; char *addr; extern char *shmat(); shmid = shmget(75, 64*1024, 0777); addr = shmat(shmid, 0, 0) pint= (int *) addr; while (*pint == 0) ; for (i = 0; i < 256; i++) printf ("%d\n", *pint++): }
exec
et avec l'entrée/sortie standard
prédéfinie (à cause de < ou >). Or les file descriptors
traversent exec
. D'où
fd0 = open ("fichier1", 1); fd1 = open ("fichier2", 2); fd3 = open ("fichier3", 2); if ((pid = fork()) == 0) { close (0); dup (fd1); close (1); dup (fd2); close (2); dup (fd3); execlp ("prog", ...); exit (1); }
dup()
duplique le file descriptor sur le premier
disponible. On peut aussi utiliser dup2()
.
fd0 = open ("/dev/ttÿ, 1); fd1 = open ("/dev/ttÿ, 2); fd3 = open ("/dev/ttÿ, 2); if ((pid = fork()) == 0) { close (0); dup (fd1); close (1); dup (fd2); close (2); dup (fd3); execlp ("prog", ...); exit (1); }
pipe()
crée un tampon que l'on peut écrire d'un côté
et lire de l'autre de manière asynchrone. Il renvoie 2 file
descriptors pour lire et écrire.
char buf[1024]; int fds[2]; strcpy (buf, "Coucou!"); pipe(fds); for (;;) { write (fds[1], buf, strlen ("Coucou!")); read (fds[0], buf, 1024); }
fork()
pipe (fds); if ((pid1 = fork()) == 0) { close (1); dup (fds[1]); ... } if ((pid2 = fork()) == 0) { close (0); dup (fds[0]); ... }
fopen()
et fclose()
permettent de prendre l'entrée
ou la sortie standard d'une commande sur un pipe.
FILE *fopen( const char *path, const char *mode);
TIT .Communication and concurrency SLA .Robin Milner. - New York ; London ; Toronto : Prentice Hall, .1989. - XI-260 p. ; 24 cm. - (Prentice Hall international .series in computer science). TIT .Communicating sequential processes SLA .C.A.R. Hoare. - Englewood Cliffs, NJ ; London ; .Mexico : Prentice-Hall, 1985. - VIII-256 p. ; .24 cm. - (Prentice-Hall international series .in computer science). TIT .Algebraic theory of processes SLA .Matthew Hennessy. - MIT Press, 1988.
while ((c = getchar ()) != EOF) { ... }
while (((c = getchar ()) != EOF) || ((e = MouseEvent() != NULL))) { ... }impossible car
getchar()
est bloquant, et comme on évalue alors
de droite à gauche, on loupera les événements souris.
Button
de
MacPascal).
Kahn G. The semantics of a Simple Language for Parallel Programming, Proc. of IFIP Congress 74, Amsterdam, North Holland, 1974.
fork()
.
if (fork() == 0) { while ((c = getchar()) != EOF) { ... } else while ((e = MouseEvent() != NULL)) { ... }
fork()
marche bien (en supposant mémoire
partagée), sauf si les événements arrivent en rafale. Alors les
lectures se battent avec la communication de contexte des processus.
select()
.
select()
spécifie le nombre d'événements en attente
dans les file descriptors décrits par les 3 masques. Un délai
maximal peut être donné.
nfound = select(nfds, readfds, writefds, execptfds, timeout) fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) ;
select()
regarde l'état des descripteurs fd_1, fd_2, ...
fd_n, et indique si les lectures ou écritures sur ces descripteurs
bloquent. Ainsi, on peut savoir s'il y a des caractères disponibles
en input ou si une output est bloquée. Les descripteurs
sont représentés par la fonction caractéristique de leur ensemble
représentée par un tableau de bits. nfds
est le nombre de bits
de cet ensemble (donc le maximum (+1) de ces file descriptors).
Berry
) et Squeak (
Pike & Cardelli
).
Berry G., Couronne ' P., Gonthier G.. Synchronous programming of reactive systems: an introduction to Esterel. In K. Fuchi and M. Nivat, editors, Programming of Future Generation Computers, Elsevier Science Publisher B.V. (North Holland), 1988. INRIA Report 647. Pike R., Cardelli L., Squeak: a Language for Communicating with Mice. Proc of the ACM-SIGGRAPH Conference. 1985(?)
data
qui reste partagé.
Alors select()
devient moins utile, et on programme plus
naturellement avec minifork()
et entrées/sorties bloquantes,
sans avoir les inconvénients de la commutation lourde entre processus
et de la lourdeur de la communication.
/vmunix
. Utiliser nlist().