int main(int argc, char *argv[]) { int key, sid, status; /* semaphore key */ /* get semaphore id */ key = 200; sid = initsem ((key_t)key); V(sid); /* Create child processes */ if (fork() == 0) handlesem(sid); if (fork() == 0) handlesem(sid); if (fork() == 0) handlesem(sid); if (fork() == 0) handlesem(sid); sleep (1); wait(&status); wait(&status); wait(&status); wait(&status); /* remove semaphore */ semctl(sid,0,IPC_RMID,0); exit(0); }
int main(void) { key_t key; int semid; sembuf sb; sb.sem_num = 0; sb.sem_op = -1; // sb.sem_flg = SEM_UNDO; if((key = ftok("ftokfile" , 'A' )) == -1) { perror("ftok"); exit(1); } printf("Key = %d\n" ,key); if((semid = initsem(key , 1)) == -1) { perror("initsem"); exit(1); } printf("After Initsem \n"); while(1) { sb.sem_op = -1; if(semop(semid,&sb,1) == -1) { perror("semop lock"); exit(1); } // printf("Got lock Process 1 *count == %d \n" , *count); std::cout << "reached HEre " << std::endl; if( (*count) % 2 == 0 && (*count) <= 20 ) { printf(" Process 1 %d " , (*count)); std::cout << "Printed" << std::endl; (*count)++; } if( (*count) > 20) { // unlock semaphore and exit sb.sem_op = 1; // free the resource if(semop(semid , &sb , 1) == -1) { perror("semop"); } exit(1); } sb.sem_op = 1; // free the resource if(semop(semid , &sb , 1) == -1) { printf("Entered here \n"); perror("semop"); exit(1); } } }
int main() { key_t semkey = 0x200; // 서버에서 작업할 때는 자기 학번 등을 이용하여 다른 사람의 키와 중복되지 않게 해야 함 key_t semkey2 = 0x201; int semid; //semid 는 semid을 뜻한다. int c1; pid_t pid; int queue[100]; int i; pid = getpid(); if ((semid = initsem(semkey,1)) < 0) // 세마포를 연결한다.(없으면 초기값을 1로 주면서 새로 만들어서 연결한다.) exit(1); if ((c1 = initsem(semkey2,0)) < 0) // c1 세마포 연결한다. exit(1); // prinff("\nprocess %d before critical section\n", pid); /* for(i = 0; i < 1000; i++){ p(semid); // semid Acquire() add1(); printf("Length : %d\n", length); // printf("process %d leaving critical section\n", pid); v(semid); // semid Release() }*/ for(i = 1; i < 10; i++){ p(semid); test += i; _signal(c1); v(semid); p(semid); while(test == 0){ _wait(c1, semid); } test -= i; v(semid); } printf("process %d exiting\n",pid); exit(0); return 0; }
/****************************************************************************** * * * Function: zbx_module_init * * * * Purpose: the function is called on agent startup * * It should be used to call any initialization routines * * * * Return value: ZBX_MODULE_OK - success * * ZBX_MODULE_FAIL - module initialization failed * * * * Comment: the module won't be loaded in case of ZBX_MODULE_FAIL * * * ******************************************************************************/ int zbx_module_init() { if (ZBX_MUTEX_ERROR == (MODBUS_SEM_ID = initsem())) { //"unable to create semaphore set for serial port")); return ZBX_MODULE_FAIL; } /*This function should perform the necessary initialization for the module (if any). If successful, it should return ZBX_MODULE_OK. Otherwise, it should return ZBX_MODULE_FAIL.*/ return ZBX_MODULE_OK; }
BlockingQueue::BlockingQueue() { key_t cntkey; if((cntkey = ftok(".", (int)getpid())) == -1) { throw "cntkey ftok failed"; } if((cntsemid_ = initsem(cntkey, 0)) == -1) { throw "cnt initsem failed"; } pthread_mutex_init(&queueLock, 0); }
int main(void) { key_t key; int semid; struct sembuf sb; sb.sem_num = 0; sb.sem_op = -1; /* set to allocate resource */ sb.sem_flg = SEM_UNDO; if ((key = ftok("semdemo.c", 'J')) == -1) { perror("ftok"); exit(1); } /* grab the semaphore set created by seminit.c: */ if ((semid = initsem(key, 1)) == -1) { perror("initsem"); exit(1); } printf("Press return to lock: "); getchar(); printf("Trying to lock...\n"); if (semop(semid, &sb, 1) == -1) { perror("semop"); exit(1); } printf("Locked.\n"); printf("Press return to unlock: "); getchar(); sb.sem_op = 1; /* free resource */ if (semop(semid, &sb, 1) == -1) { perror("semop"); exit(1); } printf("Unlocked\n"); return 0; }
int main() { int pid; int status; int shmidG, shmidSEM; int args[3]; int i; void *thread_result; // Declarar memoria compartida shmidG=shmget(0x1234,sizeof(g),0666|IPC_CREAT); shmidSEM=shmget(0x1235, sizeof(mySem),0666|IPC_CREAT); if(shmidG==-1 || shmidSEM==-1) { perror("Error en la memoria compartida\n"); exit(1); } g=shmat(shmidG,NULL,0); mySem=shmat(shmidSEM,NULL,0); if(g==NULL || mySem==NULL) { perror("Error en el shmat\n"); exit(2); } *g=0; initsem(mySem, 1); srand(getpid()); for(i=0;i<3;i++) { // Crea un nuevo proceso hijo que ejecuta la función proceso() pid=fork(); if(pid==0) proceso(i); } for(i=0;i<3;i++) pid = wait(&status); // Eliminar la memoria compartida shmdt(g); shmdt(mySem); }
int main (int argc, char *argv[]) { int err=0; struct sockaddr_in sa; int ssa = sizeof(struct sockaddr_in); struct hostent *hp; if (argc != 2) { fprintf(stderr, "usage: echod <own hostname>\n"); exit(1); } signal(SIGTERM, closesock); signal(SIGINT, closesock); signal(SIGKILL, closesock); signal(SIGSTOP, closesock); initsem(); /* Wait(&sem_dump); fprintf(stderr,"\nFork(terminator) == %d\n", Fork(2000,terminator,0)); Signal(&sem_dump); */ s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s<0) { Wait(&sem_dump); perror("socket"); Signal(&sem_dump); goto end; } hp = gethostbyname(argv[1]); if (hp != NULL) { memset((char *)&sa, sizeof(sa), 0); memcpy(&sa.sin_addr,hp->h_addr,hp->h_length); sa.sin_family = hp->h_addrtype; } else { sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(argv[1]); } sa.sin_port = htons(8000); if (sa.sin_addr.s_addr == INADDR_NONE) { fprintf(stderr, "bad address\n"); exit(1); } err = bind (s, (caddr_t)&sa, ssa); if (err) { Wait(&sem_dump); perror("bind"); Signal(&sem_dump); goto end; } err = listen (s, 2); if (err) { Wait(&sem_dump); perror("listen"); Signal(&sem_dump); goto end; } Wait(&sem_dump); fprintf(stderr,"\nWaiting for accept...\n"); Signal(&sem_dump); ns = accept(s, (caddr_t)&sa, &ssa); if (ns<0) { Wait(&sem_dump); perror("accept"); Signal(&sem_dump); goto end; } #if DEBUG val = 1; err = setsockopt (ns, SOL_SOCKET, SO_DEBUG, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } val = 4; err = getsockopt (ns, SOL_SOCKET, SO_DEBUG, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } Wait(&sem_dump); if (*((int *)valbuf) == SO_DEBUG) fprintf(stderr,"socket option set to SO_DEBUG\n"); else fprintf(stderr,"failed to set socket option to SO_DEBUG\n"); Signal(&sem_dump); #endif #if OOBINLINE val = 1; err = setsockopt (ns, SOL_SOCKET, SO_OOBINLINE, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } val = 4; err = getsockopt (ns, SOL_SOCKET, SO_OOBINLINE, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } Wait(&sem_dump); if (*((int *)valbuf) == SO_OOBINLINE) fprintf(stderr,"socket option set to SO_OOBINLINE\n"); else fprintf(stderr,"failed to set socket option to SO_OOBINLINE\n"); Signal(&sem_dump); #endif #if KEEPALIVE val = 1; err = setsockopt (ns, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } val = 4; err = getsockopt (ns, SOL_SOCKET, SO_KEEPALIVE, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } Wait(&sem_dump); if (*((int *)valbuf) == SO_KEEPALIVE) fprintf(stderr,"socket option set to SO_KEEPALIVE\n"); else fprintf(stderr,"failed to set socket option to SO_KEEPALIVE\n"); Signal(&sem_dump); #endif /* val = 4; err = getsockopt (ns, SOL_SOCKET, SO_RCVBUF, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } rcvbuf = MIN(rcvbuf, *((int *)valbuf)); Wait(&sem_dump); fprintf(stderr,"initial SO_RCVBUF: %d\n", rcvbuf); Signal(&sem_dump); */ #ifdef RCVBUF val = RCVBUF; err = setsockopt (ns, SOL_SOCKET, SO_RCVBUF, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } /* val = 4; err = getsockopt (ns, SOL_SOCKET, SO_RCVBUF, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } rcvbuf = *((int *)valbuf); Wait(&sem_dump); fprintf(stderr,"now is SO_RCVBUF: %d\n", rcvbuf); Signal(&sem_dump); */ #endif /* val = 4; err = getsockopt (ns, SOL_SOCKET, SO_SNDBUF, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } sndbuf = MIN(sndbuf, *((int *)valbuf)); Wait(&sem_dump); fprintf(stderr,"initial SO_SNDBUF: %d\n", sndbuf); Signal(&sem_dump); */ #ifdef SNDBUF val = SNDBUF; err = setsockopt (ns, SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } /* val = 4; err = getsockopt (ns, SOL_SOCKET, SO_SNDBUF, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } sndbuf = *((int *)valbuf); Wait(&sem_dump); fprintf(stderr,"now is SO_SNDBUF: %d\n", sndbuf); Signal(&sem_dump); */ #endif Wait(&sem_dump); fprintf(stderr,"Fork(monitor_process) == %d\n\n", Fork(2000,monitor_process, 4, ns)); Signal(&sem_dump); { extern char *inet_ntoa(); static struct sockaddr_in local, peer; int ssa, err = 0; ssa = sizeof(struct sockaddr_in); err = getsockname(ns, &local, &ssa); if (err) { Wait(&sem_dump); perror("getsockname"); Signal(&sem_dump); } ssa = sizeof(struct sockaddr_in); err = getpeername(ns, &peer, &ssa); if (err) { Wait(&sem_dump); perror("getpeername"); Signal(&sem_dump); } Wait(&sem_dump); fprintf(stderr," addressfamily port# internetaddress\n"); fprintf(stderr,"local Socket: %d %d %s\n" , local.sin_family, ntohs(local.sin_port) , inet_ntoa(local.sin_addr.s_addr)); fprintf(stderr,"remote Socket: %d %d %s\n" , peer.sin_family, ntohs(peer.sin_port) , inet_ntoa(peer.sin_addr.s_addr)); fprintf(stderr,"\n"); Signal(&sem_dump); } forever { int off; int len; r1: err = recv(ns,buffer, rcvbuf, 0); if (err < 0) { if (errno = EWOULDBLOCK) goto r1; Wait(&sem_dump); perror("recv"); Signal(&sem_dump); goto end; } count_r += err; /* Wait(&sem_dump); fprintf(stderr,"ECHO: >%d< bytes received, Abs %u", err, count_r); Signal(&sem_dump); */ #if 1 len = err; off = 0; while (len > 0) { s1: err = send(ns,&buffer[off],len, 0); if (err < 0) { if (errno = EWOULDBLOCK) goto s1; Wait(&sem_dump); perror("send"); Signal(&sem_dump); goto end; } off +=err; len -=err; count_s += err; if (len > 0) { Wait(&sem_dump); fprintf(stderr," ECHO: ERR < LEN"); Signal(&sem_dump); } /* Wait(&sem_dump); fprintf(stderr,"ECHO: >%d< bytes sent, Abs %u", err, count_r); Signal(&sem_dump); */ } #endif } end: Wait(&sem_dump); close(s); close(ns); return(1); }
int main() { int pid; int status; int shmid, shmidgwait, shmidgsig; int args[3]; int i; printf("inicio\n"); fflush(stdout); // definir la memoria compartida shmid=shmget(0x1234,sizeof(sem),0666|IPC_CREAT); shmidgwait=shmget(0x1250,sizeof(gwait),0666|IPC_CREAT); shmidgsig=shmget(0x1275,sizeof(gsig),0666|IPC_CREAT); printf("pase el shmget \n"); fflush(stdout); if(shmid==-1 || shmidgwait==-1 || shmidgsig==-1) { perror("Error en la memoria compartida\n"); exit(1); } // Declarar el semaforo en memoria compartida sem = shmat(shmid,NULL,0); // declarar las exchanges gwait = shmat(shmidgwait,NULL,0); gsig =shmat(shmidgsig,NULL,0); if(sem == NULL || gwait == NULL || gsig == NULL) { perror("Error en el shmat\n"); exit(2); } // inciializa el semaforo y los xchnges initsem(sem, WAYS); *gwait = 0; *gsig = 0; printf("iniciamos nuestro semanforo, gwait=%d, gsig=%d\n", *gwait, *gsig); fflush(stdout); srand(getpid()); // random seed con el pid del padre for(i=0;i<3;i++) { // Crea un nuevo proceso hijo que ejecuta la función proceso() pid=fork(); if(pid==0){ printf("\n entramos a proceso: %d", i); fflush(stdout); proceso(i, pid); } } for(i=0;i<3;i++) pid = wait(&status); // Eliminar la memoria compartida shmdt(sem); shmdt(gwait); shmdt(gsig); }
int main(int argc, char *argv[]) { if(argc < 2) { perror("Run executable as <executable-path> <probability>\n"); exit(1); } srand(time(NULL)); key_t key; if ((key = ftok("manager.c", 'J')) == -1) { perror("ftok"); exit(1); } if ((sid = initsem(key, 6)) == -1) { perror("initsem"); exit(1); } int i, n, j; float cur, p; p = atof(argv[1]); fp1 = fopen("sequence.txt", "r"); fp2 = fopen("matrix.txt", "w"); fgets(trains, MAX_TRAINS, fp1); n = strlen(trains); fprintf(fp2, "\t\t\t\t\tSemaphores\n\t\tNorth\tWest\tSouth\tEast\n"); for(i=0;i<n;i++) fprintf(fp2, "\t\t0\t0\t0\t0\n\n"); fclose(fp1); fclose(fp2); A = (int **)malloc(n*sizeof(int *)); for(i=0;i<n;i++) A[i] = (int *)malloc(4*sizeof(int)); for(i=0;i<n;) { cur = (rand()%101)/100; if(cur > p) { createTrain(i, n); i++; } else { if(checkDeadlock(n)==1) { printf("............................\nSystem Deadlocked\n"); for(j=0;j<i;j++) kill(tr_pr[j], SIGKILL); exit(1); } } } while(1) { sleep(1); if(checkDeadlock(n)==1) { printf("............................\nSystem Deadlocked\n"); for(j=0;j<i;j++) kill(tr_pr[j], SIGKILL); exit(1); } } return 0; }
int main(int argc, char *argv[]) { char *p; const char *last_component; char *outfile = NULL; int pflag, ch, eflag, uflag, fflag; pflag = eflag = uflag = fflag = 0; while ((ch = getopt(argc, argv, "egpfb:s:o:u")) != -1) { switch (ch) { case 'o': outfile = optarg; break; case 'u': uflag = 1; break; case 'f': fflag = 1; break; case 'e': eflag = 1; if (!isatty(STDIN_FILENO)) verbose = 1; break; case 'g': /* * In addition to DEBUG, you probably wanted to * set "options KGDB" and maybe others. We could * do that for you, but you really should just * put them in the config file. */ (void)fputs( "-g is obsolete (use makeoptions DEBUG=\"-g\")\n", stderr); usage(); case 'p': /* * Essentially the same as makeoptions PROF="-pg", * but also changes the path from ../../compile/FOO * to ../../compile/FOO.PROF; i.e., compile a * profiling kernel based on a typical "regular" * kernel. * * Note that if you always want profiling, you * can (and should) use a "makeoptions" line. */ pflag = 1; break; case 'b': builddir = optarg; break; case 's': srcdir = optarg; break; default: usage(); } } argc -= optind; argv += optind; if (argc > 1 || (eflag && argv[0] == NULL)) usage(); if (eflag) { #ifdef MAKE_BOOTSTRAP fprintf(stderr, "config: UKC not available in this binary\n"); exit(1); #else return (ukc(argv[0], outfile, uflag, fflag)); #endif } conffile = (argc == 1) ? argv[0] : "CONFIG"; if (firstfile(conffile)) { (void)fprintf(stderr, "config: cannot read %s: %s\n", conffile, strerror(errno)); exit(2); } /* * Init variables. */ minmaxusers = 1; maxmaxusers = 10000; initintern(); initfiles(); initsem(); devbasetab = ht_new(); devatab = ht_new(); selecttab = ht_new(); needcnttab = ht_new(); opttab = ht_new(); mkopttab = ht_new(); defopttab = ht_new(); nextopt = &options; nextmkopt = &mkoptions; nextdefopt = &defoptions; /* * Handle profiling (must do this before we try to create any * files). */ last_component = strrchr(conffile, '/'); last_component = (last_component) ? last_component + 1 : conffile; if (pflag) { int len = strlen(last_component) + 17; p = emalloc(len); (void)snprintf(p, len, "../compile/%s.PROF", last_component); (void)addmkoption(intern("PROF"), "-pg"); (void)addoption(intern("GPROF"), NULL); } else { int len = strlen(last_component) + 12; p = emalloc(len); (void)snprintf(p, len, "../compile/%s", last_component); } defbuilddir = (argc == 0) ? "." : p; /* * Parse config file (including machine definitions). */ if (yyparse()) stop(); /* * Fix (as in `set firmly in place') files. */ if (fixfiles()) stop(); /* * Fix objects and libraries. */ if (fixobjects()) stop(); /* * Perform cross-checking. */ if (maxusers == 0) { if (defmaxusers) { (void)printf("maxusers not specified; %d assumed\n", defmaxusers); maxusers = defmaxusers; } else { (void)fprintf(stderr, "config: need \"maxusers\" line\n"); errors++; } } if (crosscheck() || errors) stop(); /* * Squeeze things down and finish cross-checks (STAR checks must * run after packing). */ pack(); if (badstar()) stop(); /* * Ready to go. Build all the various files. */ if (mksymlinks() || mkmakefile() || mkheaders() || mkswap() || mkioconf()) stop(); optiondelta(); exit(0); }
void main(int argc, char *argv[]) { sleep(atoi(argv[1])); key_t semkey = 0x200; key_t key_m = 2011331500; //lock key_t key_okR = 2011331501;//okread (condi) key_t key_okW = 2011331502;//okwirte (condi) int semid,lock,okToRead,okToWrite; pid_t pid; pid = getpid(); if ((lock = initsem(key_m,1)) < 0) exit(1); if ((okToRead = initsem(key_okR,0)) < 0) exit(1); if ((okToWrite = initsem(key_okW,0)) < 0) exit(1); printf("process %d in critical section\n",pid); // First check self into system p(lock); //lock.Acquire(); int AW=0,AR=0,WW=0,WR=0; readFile(&AW,&AR,&WW,&WR); while ((AW + AR) > 0) { // Is it safe to read? //readFile(&AW,&AR,&WW,&WR); WW++; // No. Writers exist writeFile(&AW,&AR,&WW,&WR); wait(okToWrite,lock); //okToRead.wait(&lock); readFile(&AW,&AR,&WW,&WR); WW--; // No longer waiting writeFile(&AW,&AR,&WW,&WR); } AW++; // Now we are active! writeFile(&AW,&AR,&WW,&WR); v(lock); //lock.Release(); sleep(atoi(argv[2])); // Now, check out of system p(lock); readFile(&AW,&AR,&WW,&WR); AW--; // No longer active writeFile(&AW,&AR,&WW,&WR); readFile(&AW,&AR,&WW,&WR); if (WW > 0){ // No other active readers signal(okToWrite,lock); //okToWrite.signal(); } //readFile(&AW,&AR,&WW,&WR); else if(WR > 0){ broadCast(okToRead,lock); //okToRead.broadcast(); } v(lock); //lock.Release(); exit(0); }
int main (int argc, char *argv[]) { int err=0, len=0, i; struct sockaddr_in sa; int ssa = sizeof(struct sockaddr_in); char c; struct hostent *hp; if (argc != 3) { fprintf(stderr, "usage: client <own hostname> <remote hostname>\n"); exit(1); } signal(SIGTERM, closesock); signal(SIGINT, closesock); signal(SIGKILL, closesock); signal(SIGSTOP, closesock); initsem(); initbuffer(); s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s<0) { Wait(&sem_dump); perror("socket"); Signal(&sem_dump); goto end; } hp = gethostbyname(argv[1]); if (hp != NULL) { memset((char *)&sa, sizeof(sa), 0); memcpy(&sa.sin_addr,hp->h_addr,hp->h_length); sa.sin_family = hp->h_addrtype; } else { sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(argv[1]); } sa.sin_port = htons(7777); if (sa.sin_addr.s_addr == INADDR_NONE) { fprintf(stderr, "bad address\n"); exit(1); } err = bind (s, (caddr_t)&sa, ssa); if (err) { Wait(&sem_dump); perror("bind"); Signal(&sem_dump); goto end; } #if DEBUG val = 1; err = setsockopt (s, SOL_SOCKET, SO_DEBUG, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } val = 4; err = getsockopt (s, SOL_SOCKET, SO_DEBUG, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } Wait(&sem_dump); if (*((int *)valbuf) == SO_DEBUG) fprintf(stderr,"socket option set to SO_DEBUG\n"); else fprintf(stderr,"failed to set socket option to SO_DEBUG\n"); Signal(&sem_dump); #endif #if OOBINLINE val = 1; err = setsockopt (s, SOL_SOCKET, SO_OOBINLINE, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } val = 4; err = getsockopt (s, SOL_SOCKET, SO_OOBINLINE, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } Wait(&sem_dump); if (*((int *)valbuf) == SO_OOBINLINE) fprintf(stderr,"socket option set to SO_OOBINLINE\n"); else fprintf(stderr,"failed to set socket option to SO_OOBINLINE\n"); Signal(&sem_dump); #endif #if KEEPALIVE val = 1; err = setsockopt (s, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } val = 4; err = getsockopt (s, SOL_SOCKET, SO_KEEPALIVE, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } Wait(&sem_dump); if (*((int *)valbuf) == SO_KEEPALIVE) fprintf(stderr,"socket option set to SO_KEEPALIVE\n"); else fprintf(stderr,"failed to set socket option to SO_KEEPALIVE\n"); Signal(&sem_dump); #endif /* val = 4; err = getsockopt (s, SOL_SOCKET, SO_RCVBUF, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } rcvbuf = MIN(rcvbuf, *((int *)valbuf)); Wait(&sem_dump); fprintf(stderr,"initial SO_RCVBUF: %d\n", rcvbuf); Signal(&sem_dump); */ #ifdef RCVBUF val = RCVBUF; err = setsockopt (s, SOL_SOCKET, SO_RCVBUF, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } /* val = 4; err = getsockopt (s, SOL_SOCKET, SO_RCVBUF, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } rcvbuf = *((int *)valbuf); Wait(&sem_dump); fprintf(stderr,"now is SO_RCVBUF: %d\n", rcvbuf); Signal(&sem_dump); */ #endif /* val = 4; err = getsockopt (s, SOL_SOCKET, SO_SNDBUF, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } sndbuf = MIN(sndbuf, *((int *)valbuf)); Wait(&sem_dump); fprintf(stderr,"initial SO_SNDBUF: %d\n", sndbuf); Signal(&sem_dump); */ #ifdef SNDBUF val = SNDBUF; err = setsockopt (s, SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); if (err) { Wait(&sem_dump); perror("setsockopt"); Signal(&sem_dump); goto end; } /* val = 4; err = getsockopt (s, SOL_SOCKET, SO_SNDBUF, valbuf, &val); if (err) { Wait(&sem_dump); perror("getsockopt"); Signal(&sem_dump); goto end; } sndbuf = *((int *)valbuf); Wait(&sem_dump); fprintf(stderr,"now is SO_SNDBUF: %d\n", sndbuf); Signal(&sem_dump); */ #endif /* Wait(&sem_dump); fprintf(stderr,"Press return to continue ..."); fflush(stderr); while((c = getchar())!='\n'); Signal(&sem_dump); */ hp = gethostbyname(argv[2]); if (hp != NULL) { memset((char *)&sa, sizeof(sa), 0); memcpy(&sa.sin_addr,hp->h_addr,hp->h_length); sa.sin_family = hp->h_addrtype; } else { sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(argv[2]); } sa.sin_port = htons(8000); if (sa.sin_addr.s_addr == INADDR_NONE) { fprintf(stderr, "bad address\n"); exit(1); } Wait(&sem_dump); fprintf(stderr,"connecting...\n"); fflush(stderr); Signal(&sem_dump); err = connect (s, (caddr_t)&sa, ssa); if (err) { Wait(&sem_dump); perror("connect"); Signal(&sem_dump); goto end; } { int on = 1; ioctl(s, FIONBIO, &on); } Wait(&sem_dump); fprintf(stderr,"connected!!!\n"); fflush(stderr); fprintf(stderr,"\nFork(monitor_process) == %d\n", Fork(2000,monitor_process, 4, s)); fprintf(stderr,"\nFork(receiver) == %d\n", Fork(8000,receiver, 4, s)); Signal(&sem_dump); { extern char *inet_ntoa(); static struct sockaddr_in local, peer; int ssa, err = 0; ssa = sizeof(struct sockaddr_in); err = getsockname(s, &local, &ssa); if (err) { Wait(&sem_dump); perror("getsockname"); Signal(&sem_dump); } ssa = sizeof(struct sockaddr_in); err = getpeername(s, &peer, &ssa); if (err) { Wait(&sem_dump); perror("getpeername"); Signal(&sem_dump); } Wait(&sem_dump); fprintf(stderr," addressfamily port# internetaddress\n"); fprintf(stderr,"local Socket: %d %d %s\n" , local.sin_family, ntohs(local.sin_port) , inet_ntoa(local.sin_addr.s_addr)); fprintf(stderr,"remote Socket: %d %d %s\n" , peer.sin_family, ntohs(peer.sin_port) , inet_ntoa(peer.sin_addr.s_addr)); fprintf(stderr,"\n"); Signal(&sem_dump); } forever { int len; /* len = MIN(BUFFER - snd_p, MAX(abs(_ldtimer(0)%sndbuf),12) ); */ len = sndbuf/2; /* err = send (s, &buffer[snd_p], len, 0); */ s1: err = send (s, buffer, len, 0); if (err < 0) { if (errno = EWOULDBLOCK) goto s1; Wait(&sem_dump); perror("send"); Signal(&sem_dump); goto end; } count_s += err; /* snd_p = ((snd_p + err) < BUFFER) ? (snd_p + err) : (snd_p + err - BUFFER); */ } end: Wait(&sem_dump); return(0); }