Пример #1
0
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);
}
Пример #2
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);
		}
	}
}
Пример #3
0
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;
}
Пример #4
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;
}
Пример #5
0
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);
}
Пример #6
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;
}
Пример #7
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);
}
Пример #8
0
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);
}	
Пример #9
0
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);
}
Пример #10
0
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;
}
Пример #11
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);
}
Пример #13
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);
}