/* examples/misc/tube.c */ #include He_node *princ, *panel, *mess1, *mess2, *mess3; int fork_val, timeout1, nb_oper = 0; double nb_octets = 0, temps0; /* Le taux de transfert dépend de BUFMAX. Si BUFMAX est trop grand, la lecture se fait en plusieurs fois */ #define BUFMAX 4096 char buf[BUFMAX]; void tube_write (int fd, Ulong rcond, void *data) { int n = write (fd, buf, BUFMAX); nb_octets += n; nb_oper++; } void tube_read (int fd, Ulong rcond, void *data) { int n = read (fd, buf, BUFMAX); nb_octets += n; nb_oper++; } int timeout1_proc (int h, void *data) { char bla[80]; sprintf (bla, "%.0f", nb_octets / 1024); HeSetMessageLabel (mess1, bla); sprintf (bla, "%.0f", (nb_octets / 1024) / (HeGetTime()-temps0)); HeSetMessageLabel (mess2, bla); sprintf (bla, "%.0f", (double) nb_oper / (HeGetTime()-temps0)); HeSetMessageLabel (mess3, bla); return TRUE ; } void butt_quit (He_node *hn) { HeQuit(0); } int main (int argc, char *argv[]) { int tube[2]; /* Création tube */ if (pipe(tube) < 0) { perror("pipe"); exit(1); } /* fils = 0, père != 0 */ fork_val = fork(); /* Le processus propriétaire d'un connection X doit être unique ; il faut donc impérativement que le fork() ait lieu AVANT HeInit, car sinon le père et le fils auraient la même connection X. */ HeInit (&argc, &argv); princ = HeCreateFrame (); HeSetFrameLabel (princ, fork_val == 0 ? "Tube réception (fils)" : "Tube émission (père)"); panel = HeCreatePanel (princ); HeCreateButtonP (panel, "Quit", butt_quit, NULL); HeSetPanelLayout (panel, HE_LINE_FEED); HeCreateMessageP (panel, fork_val == 0 ? "K-octets reçus :" : "K-octets envoyés :", TRUE); mess1 = HeCreateMessage(panel); HeSetPanelLayout (panel, HE_LINE_FEED); HeCreateMessageP (panel, "K-octets/seconde :", TRUE); mess2 = HeCreateMessage(panel); HeSetPanelLayout (panel, HE_LINE_FEED); HeCreateMessageP (panel, "opérations/seconde :", TRUE); mess3 = HeCreateMessage(panel); if (fork_val == 0) HeAddIO (tube[0], HE_IO_READ, tube_read, NULL); else HeAddIO (tube[1], HE_IO_WRITE, tube_write, NULL); timeout1 = HeAddTimeout (200, timeout1_proc, NULL); temps0 = HeGetTime(); return HeMainLoop (princ); }