From 0d1802dcd969187e6133ba143ebc473c9fefc259 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 9 Sep 2001 17:39:15 +0000 Subject: [PATCH] Messi anlcuni nuovi esempi. E messa la GPL negli esempi. --- prochand.tex | 97 ++++++++++--- socket.tex | 8 +- sources/ElemDaytimeTCPClient.c | 127 +++++++++++++++++ sources/ElemDaytimeTCPCuncServ.c | 22 ++- sources/ElemDaytimeTCPServer.c | 24 +++- sources/ElemEchoTCPServer.c | 28 +++- sources/ErrCode.c | 226 +++++++++++++++++++++++++++++++ sources/ForkTest.c | 95 +++++++++++++ sources/Makefile | 19 ++- 9 files changed, 609 insertions(+), 37 deletions(-) create mode 100644 sources/ElemDaytimeTCPClient.c create mode 100644 sources/ErrCode.c create mode 100644 sources/ForkTest.c diff --git a/prochand.tex b/prochand.tex index 59eb404..8f8beaf 100644 --- a/prochand.tex +++ b/prochand.tex @@ -208,25 +208,90 @@ ritorno della funzione fork figlio è zero; in questo modo il programma può identificare se viene eseguito dal padre o dal figlio. -Si noti come la funzione \fucn{fork} ritorni \textbf{due} volte: nel padre e -nel figlio. La sola differenza che si ha nei due processi è il valore di +\begin{figure}[!htb] + \footnotesize + \begin{lstlisting}{} +#include /* error definitions and routines */ +#include /* C standard library */ +#include /* unix standard library */ +#include /* standard I/O library */ +#include /* string functions */ + +/* Help printing routine */ +void usage(void); + +int main(int argc, char *argv[]) +{ +/* + * Variables definition + */ + int i; + int nchild; + pid_t pid; + + ... /* handling options */ + + /* There must be remaing parameters */ + if (optind == argc) { + usage(); + } + nchild = atoi(argv[optind]); + printf("Test for forking %d child\n", nchild); + /* loop to fork children */ + for (i=0; i /* predefined types */ +#include /* include unix standard library */ +#include /* IP addresses conversion utiliites */ +#include /* socket library */ +#include /* include standard I/O library */ + +#define MAXLINE 80 +/* Program begin */ +void usage(void); +int main(int argc, char *argv[]) +{ +/* + * Variables definition + */ + int sock_fd; + int i, nread; + struct sockaddr_in serv_add; + char buffer[MAXLINE]; + /* + * Input section: decode parameters passed in the calling + * Use getopt function + */ + opterr = 0; /* don't want writing to stderr */ + while ( (i = getopt(argc, argv, "h")) != -1) { + switch (i) { + /* + * Handling options + */ + case 'h': + printf("Wrong -h option use\n"); + usage(); + return(0); + break; + case '?': /* unrecognized options */ + printf("Unrecognized options -%c\n",optopt); + usage(); + default: /* should not reached */ + usage(); + } + } + /* *********************************************************** + * + * Options processing completed + * + * Main code beginning + * + * ***********************************************************/ + /* create socket */ + if ( (sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("Socket creation error"); + return -1; + } + /* initialize address */ + memset((void *) &serv_add, 0, sizeof(serv_add)); /* clear server address */ + serv_add.sin_family = AF_INET; /* address type is INET */ + serv_add.sin_port = htons(13); /* daytime port is 13 */ + /* build address using inet_pton */ + if ( (inet_pton(AF_INET, argv[optind], &serv_add.sin_addr)) <= 0) { + perror("Address creation error"); + return -1; + } + /* extablish connection */ + if (connect(sock_fd, (struct sockaddr *)&serv_add, sizeof(serv_add)) < 0) { + perror("Connection error"); + return -1; + } + /* read daytime from server */ + while ( (nread = read(sock_fd, buffer, MAXLINE)) > 0) { + buffer[nread]=0; + if (fputs(buffer, stdout) == EOF) { /* write daytime */ + perror("fputs error"); + return -1; + } + } + /* error on read */ + if (nread < 0) { + perror("Read error"); + return -1; + } + /* normal exit */ + return 0; +} +/* + * routine to print usage info and exit + */ +void usage(void) { + printf("Take daytime from a remote host \n"); + printf("Usage:\n"); + printf(" daytime [-h] [-v] [host in dotted decimal form] \n"); + printf(" -v set verbosity on\n"); + printf(" -h print this help\n"); + exit(1); +} diff --git a/sources/ElemDaytimeTCPCuncServ.c b/sources/ElemDaytimeTCPCuncServ.c index e6e9c49..9da060e 100644 --- a/sources/ElemDaytimeTCPCuncServ.c +++ b/sources/ElemDaytimeTCPCuncServ.c @@ -1,3 +1,21 @@ +/* ElemDaytimeTCPCuncServ.c + * + * Copyright (C) 2001 Simone Piccardi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ /**************************************************************** * * Program ElemDaytimeTCPCuncServ.c @@ -6,9 +24,9 @@ * Author: Simone Piccardi * May. 2001 * - * Usage: daytimed + * Usage: daytimed -h give all info * - * $Id: ElemDaytimeTCPCuncServ.c,v 1.1 2001/05/19 20:47:03 piccardi Exp $ + * $Id: ElemDaytimeTCPCuncServ.c,v 1.2 2001/09/09 17:39:15 piccardi Exp $ * ****************************************************************/ /* diff --git a/sources/ElemDaytimeTCPServer.c b/sources/ElemDaytimeTCPServer.c index bffdb3a..057ce97 100644 --- a/sources/ElemDaytimeTCPServer.c +++ b/sources/ElemDaytimeTCPServer.c @@ -1,6 +1,24 @@ -/**************************************************************** +/* ElemDaytimeTCPClient.c + * + * Copyright (C) 2000 Simone Piccardi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +//**************************************************************** * - * Program daytime_tcp_server.c: + * Program daytimed: * Elementary TCP server for daytime service (port 13) * * Author: Simone Piccardi @@ -8,7 +26,7 @@ * * Usage: daytimed * - * $Id: ElemDaytimeTCPServer.c,v 1.1 2001/06/18 21:46:14 piccardi Exp $ + * $Id: ElemDaytimeTCPServer.c,v 1.2 2001/09/09 17:39:15 piccardi Exp $ * ****************************************************************/ /* diff --git a/sources/ElemEchoTCPServer.c b/sources/ElemEchoTCPServer.c index 7df6fed..ba36b95 100644 --- a/sources/ElemEchoTCPServer.c +++ b/sources/ElemEchoTCPServer.c @@ -1,14 +1,32 @@ +/* ElemEchoTCPServer.c + * + * Copyright (C) 2001 Simone Piccardi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ /**************************************************************** * - * Program echo_tcp_server.c: + * Program echod * Elementary TCP server for echo service (port 7) * * Author: Simone Piccardi * Jun. 2001 * - * Usage: echod + * Usage: echod -h give all info * - * $Id: ElemEchoTCPServer.c,v 1.2 2001/06/20 22:03:37 piccardi Exp $ + * $Id: ElemEchoTCPServer.c,v 1.3 2001/09/09 17:39:15 piccardi Exp $ * ****************************************************************/ /* @@ -115,9 +133,9 @@ int main(int argc, char *argv[]) * routine to print usage info and exit */ void usage(void) { - printf("Simple daytime server\n"); + printf("Elementary echo server\n"); printf("Usage:\n"); - printf(" daytimed [-h] \n"); + printf(" echod [-h] \n"); printf(" -h print this help\n"); exit(1); } diff --git a/sources/ErrCode.c b/sources/ErrCode.c new file mode 100644 index 0000000..58f5491 --- /dev/null +++ b/sources/ErrCode.c @@ -0,0 +1,226 @@ +/**************************************************************** + * + * Program ErrCode.c: + * Print error code MACRO and messages + * + * Author: Simone Piccardi + * Sep. 2001 + * + * Usage: errcode -h give all info's + * + * $Id: ErrCode.c,v 1.1 2001/09/09 17:39:15 piccardi Exp $ + * + ****************************************************************/ +/* + * Include needed headers + */ +#include /* error definitions and routines */ +#include /* C standard library */ +#include /* unix standard library */ +#include /* standard I/O library */ +#include /* string functions */ + +/* Help printing routine */ +void usage(void); + +/* Array for code number <=> code macro name */ +char * err_code[] = { +"SUCCESS ", /* 0 Success */ +"EPERM ", /* 1 Operation not permitted */ +"ENOENT ", /* 2 No such file or directory */ +"ESRCH ", /* 3 No such process */ +"EINTR ", /* 4 Interrupted system call */ +"EIO ", /* 5 I/O error */ +"ENXIO ", /* 6 No such device or address */ +"E2BIG ", /* 7 Arg list too long */ +"ENOEXEC ", /* 8 Exec format error */ +"EBADF ", /* 9 Bad file number */ +"ECHILD ", /* 10 No child processes */ +"EAGAIN ", /* 11 Try again */ +"ENOMEM ", /* 12 Out of memory */ +"EACCES ", /* 13 Permission denied */ +"EFAULT ", /* 14 Bad address */ +"ENOTBLK ", /* 15 Block device required */ +"EBUSY ", /* 16 Device or resource busy */ +"EEXIST ", /* 17 File exists */ +"EXDEV ", /* 18 Cross-device link */ +"ENODEV ", /* 19 No such device */ +"ENOTDIR ", /* 20 Not a directory */ +"EISDIR ", /* 21 Is a directory */ +"EINVAL ", /* 22 Invalid argument */ +"ENFILE ", /* 23 File table overflow */ +"EMFILE ", /* 24 Too many open files */ +"ENOTTY ", /* 25 Not a typewriter */ +"ETXTBSY ", /* 26 Text file busy */ +"EFBIG ", /* 27 File too large */ +"ENOSPC ", /* 28 No space left on device */ +"ESPIPE ", /* 29 Illegal seek */ +"EROFS ", /* 30 Read-only file system */ +"EMLINK ", /* 31 Too many links */ +"EPIPE ", /* 32 Broken pipe */ +"EDOM ", /* 33 Math argument out of domain of func */ +"ERANGE ", /* 34 Math result not representable */ +"EDEADLK ", /* 35 Resource deadlock would occur */ +"ENAMETOOLONG ", /* 36 File name too long */ +"ENOLCK ", /* 37 No record locks available */ +"ENOSYS ", /* 38 Function not implemented */ +"ENOTEMPTY ", /* 39 Directory not empty */ +"ELOOP ", /* 40 Too many symbolic links encountered */ +"EWOULDBLOCK ", /* EAGAIN Operation would block */ +"ENOMSG ", /* 42 No message of desired type */ +"EIDRM ", /* 43 Identifier removed */ +"ECHRNG ", /* 44 Channel number out of range */ +"EL2NSYNC ", /* 45 Level 2 not synchronized */ +"EL3HLT ", /* 46 Level 3 halted */ +"EL3RST ", /* 47 Level 3 reset */ +"ELNRNG ", /* 48 Link number out of range */ +"EUNATCH ", /* 49 Protocol driver not attached */ +"ENOCSI ", /* 50 No CSI structure available */ +"EL2HLT ", /* 51 Level 2 halted */ +"EBADE ", /* 52 Invalid exchange */ +"EBADR ", /* 53 Invalid request descriptor */ +"EXFULL ", /* 54 Exchange full */ +"ENOANO ", /* 55 No anode */ +"EBADRQC ", /* 56 Invalid request code */ +"EBADSLT ", /* 57 Invalid slot */ +"EDEADLOCK ", /* EDEADLK */ +"EBFONT ", /* 59 Bad font file format */ +"ENOSTR ", /* 60 Device not a stream */ +"ENODATA ", /* 61 No data available */ +"ETIME ", /* 62 Timer expired */ +"ENOSR ", /* 63 Out of streams resources */ +"ENONET ", /* 64 Machine is not on the network */ +"ENOPKG ", /* 65 Package not installed */ +"EREMOTE ", /* 66 Object is remote */ +"ENOLINK ", /* 67 Link has been severed */ +"EADV ", /* 68 Advertise error */ +"ESRMNT ", /* 69 Srmount error */ +"ECOMM ", /* 70 Communication error on send */ +"EPROTO ", /* 71 Protocol error */ +"EMULTIHOP ", /* 72 Multihop attempted */ +"EDOTDOT ", /* 73 RFS specific error */ +"EBADMSG ", /* 74 Not a data message */ +"EOVERFLOW ", /* 75 Value too large for defined data type */ +"ENOTUNIQ ", /* 76 Name not unique on network */ +"EBADFD ", /* 77 File descriptor in bad state */ +"EREMCHG ", /* 78 Remote address changed */ +"ELIBACC ", /* 79 Can not access a needed shared library */ +"ELIBBAD ", /* 80 Accessing a corrupted shared library */ +"ELIBSCN ", /* 81 .lib section in a.out corrupted */ +"ELIBMAX ", /* 82 Attempting to link in too many shared libraries */ +"ELIBEXEC ", /* 83 Cannot exec a shared library directly */ +"EILSEQ ", /* 84 Illegal byte sequence */ +"ERESTART ", /* 85 Interrupted system call should be restarted */ +"ESTRPIPE ", /* 86 Streams pipe error */ +"EUSERS ", /* 87 Too many users */ +"ENOTSOCK ", /* 88 Socket operation on non-socket */ +"EDESTADDRREQ ", /* 89 Destination address required */ +"EMSGSIZE ", /* 90 Message too long */ +"EPROTOTYPE ", /* 91 Protocol wrong type for socket */ +"ENOPROTOOPT ", /* 92 Protocol not available */ +"EPROTONOSUPPORT", /* 93 Protocol not supported */ +"ESOCKTNOSUPPORT", /* 94 Socket type not supported */ +"EOPNOTSUPP ", /* 95 Operation not supported on transport endpoint */ +"EPFNOSUPPORT ", /* 96 Protocol family not supported */ +"EAFNOSUPPORT ", /* 97 Address family not supported by protocol */ +"EADDRINUSE ", /* 98 Address already in use */ +"EADDRNOTAVAIL ", /* 99 Cannot assign requested address */ +"ENETDOWN ", /* 100 Network is down */ +"ENETUNREACH ", /* 101 Network is unreachable */ +"ENETRESET ", /* 102 Network dropped connection because of reset */ +"ECONNABORTED ", /* 103 Software caused connection abort */ +"ECONNRESET ", /* 104 Connection reset by peer */ +"ENOBUFS ", /* 105 No buffer space available */ +"EISCONN ", /* 106 Transport endpoint is already connected */ +"ENOTCONN ", /* 107 Transport endpoint is not connected */ +"ESHUTDOWN ", /* 108 Cannot send after transport endpoint shutdown */ +"ETOOMANYREFS ", /* 109 Too many references: cannot splice */ +"ETIMEDOUT ", /* 110 Connection timed out */ +"ECONNREFUSED ", /* 111 Connection refused */ +"EHOSTDOWN ", /* 112 Host is down */ +"EHOSTUNREACH ", /* 113 No route to host */ +"EALREADY ", /* 114 Operation already in progress */ +"EINPROGRESS ", /* 115 Operation now in progress */ +"ESTALE ", /* 116 Stale NFS file handle */ +"EUCLEAN ", /* 117 Structure needs cleaning */ +"ENOTNAM ", /* 118 Not a XENIX named type file */ +"ENAVAIL ", /* 119 No XENIX semaphores available */ +"EISNAM ", /* 120 Is a named type file */ +"EREMOTEIO ", /* 121 Remote I/O error */ +"EDQUOT ", /* 122 Quota exceeded */ +"ENOMEDIUM ", /* 123 No medium found */ +"EMEDIUMTYPE " /* 124 Wrong medium type */ +}; +int main(int argc, char *argv[]) +{ +/* + * Variables definition + */ + int i, err; + int label = 0; + int message = 0; + /* + * Input section: decode parameters passed in the calling + * Use getopt function + */ + opterr = 0; /* don't want writing to stderr */ + while ( (i = getopt(argc, argv, "hlm")) != -1) { + switch (i) { + /* + * Handling options + */ + case 'h': + printf("Wrong -h option use\n"); + usage(); + return(0); + break; + case 'l': /* unrecognized options */ + printf("Label printing\n"); + label = 1; + break; + case 'm': /* unrecognized options */ + printf("Message printing\n"); + message = 1; + break; + case '?': /* unrecognized options */ + printf("Unrecognized options -%c\n",optopt); + usage(); + default: /* should not reached */ + usage(); + } + } + /* *********************************************************** + * + * Options processing completed + * + * Main code beginning + * + * ***********************************************************/ + if (optind == argc) { + usage(); + } + err = atoi(argv[optind]); + if (message) { + printf("Error message for %d is %s\n", err, strerror(err)); + } + if (label) { + printf("Error label for %d is %s\n", err, err_code[err]); + } + if ( (!label)&&(!message) ) { + usage(); + } + /* normal exit */ + return 0; +} +/* + * routine to print usage info and exit + */ +void usage(void) { + printf("Print error code message or macro label \n"); + printf("Usage:\n"); + printf(" daytime [-h] [-l] [-m] error code \n"); + printf(" -m print error messages\n"); + printf(" -l print error code label\n"); + printf(" -h print this help\n"); + exit(1); +} diff --git a/sources/ForkTest.c b/sources/ForkTest.c new file mode 100644 index 0000000..da38629 --- /dev/null +++ b/sources/ForkTest.c @@ -0,0 +1,95 @@ +/**************************************************************** + * + * Program ForkTest.c: + * Program to test process creation + * + * Author: Simone Piccardi + * Sep. 2001 + * + * Usage: forktest -h give all info's + * + * $Id: ForkTest.c,v 1.1 2001/09/09 17:39:15 piccardi Exp $ + * + ****************************************************************/ +/* + * Include needed headers + */ +#include /* error definitions and routines */ +#include /* C standard library */ +#include /* unix standard library */ +#include /* standard I/O library */ +#include /* string functions */ + +/* Help printing routine */ +void usage(void); + +int main(int argc, char *argv[]) +{ +/* + * Variables definition + */ + int i; + int nchild; + pid_t pid; + /* + * Input section: decode command line parameters + * Use getopt function + */ + opterr = 0; /* don't want writing to stderr */ + while ( (i = getopt(argc, argv, "h")) != -1) { + switch (i) { + /* + * Handling options + */ + case 'h': + printf("Wrong -h option use\n"); + usage(); + return(0); + break; + case '?': /* unrecognized options */ + printf("Unrecognized options -%c\n",optopt); + usage(); + default: /* should not reached */ + usage(); + } + } + /* *********************************************************** + * + * Options processing completed + * + * Main code beginning + * + * ***********************************************************/ + /* There must be remaing parameters */ + if (optind == argc) { + usage(); + } + nchild = atoi(argv[optind]); + printf("Test for forking %d child\n", nchild); + /* loop to fork children */ + for (i=0; i