예제 #1
0
int
main(int argc, char **argv)
{
	int			listenfd, i;
	socklen_t	addrlen;
	void		sig_int(int);
	pid_t		child_make(int, int, int);

	if (argc == 3)
		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
	else if (argc == 4)
		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
	else
		err_quit("usage: serv03 [ <host> ] <port#> <#children>");
	nchildren = atoi(argv[argc-1]);
	pids = Calloc(nchildren, sizeof(pid_t));
	cptr = meter(nchildren);

	my_lock_init("/tmp/lock.XXXXXX");	/* one lock file for all children */
	for (i = 0; i < nchildren; i++)
		pids[i] = child_make(i, listenfd, addrlen);	/* parent returns */

	Signal(SIGINT, sig_int);

	for ( ; ; )
		pause();	/* everything done by children */
}
예제 #2
0
int main(int argc, char **argv)
{
    int fd, zero = 0;
    int *ptr;
    pid_t pid;
    struct stat buf;

    if (argc != 2) {
        perror("usage: incr2 <pathname>"); 
        exit(1); 
    }

    /* open file, initialize to 0, map into memory */
    // stat() in <sys/stat.h>, check whether this is the first to open the file
    if (stat(argv[1], &buf) == -1 && errno == ENOENT) {
        /* first time, using O_CREAT */
        if ((fd = open(argv[1], O_RDWR | O_CREAT, FILE_MODE)) < 0) {
            perror("create failed"); 
            exit(1);
        }
        if (write(fd, &zero, sizeof(int)) <0) {
            perror("write failed"); 
            exit(1);
        }
    } else if ((fd = open(argv[1], O_RDWR, FILE_MODE)) < 0) {
        perror("open failed"); 
        exit(1);
    }
    
    ptr = (int *)mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED) {
        perror("mmap failed"); 
        exit(1); 
    }

    /* create, initialize, and unlink file lock */
    my_lock_init(fd);

    setbuf(stdout, NULL);   /* stdout is unbuffered */
    
    my_lock_wait();
    printf("pid %d: get lock\n", getpid());
    sleep(5);
    printf("pid %d: %d\n", getpid(), (*ptr)++);
    my_lock_release();

    close(fd);
    unlink(argv[1]);
    exit(0);
}
예제 #3
0
파일: client.c 프로젝트: cc1989/unpv13e
int
main(int argc, char **argv)
{
	int		i, j, fd, nchildren, nloops, nbytes;
	pid_t	pid;
	ssize_t	n;
	char	request[MAXLINE], reply[MAXN];
	int count = 0;

	if (argc != 6)
		err_quit("usage: client <hostname or IPaddr> <port> <#children> "
				 "<#loops/child> <#bytes/request>");

	nchildren = atoi(argv[3]);
	nloops = atoi(argv[4]);
	nbytes = atoi(argv[5]);
	snprintf(request, sizeof(request), "%d\n", nbytes); /* newline at end */
	my_lock_init(NULL);

	for (i = 0; i < nchildren; i++) {
		if ( (pid = Fork()) == 0) {		/* child */
			for (j = 0; j < nloops; j++) {
				fd = Tcp_connect(argv[1], argv[2]);

				/*printf("%d : %d\n", getpid(), j);
				Write(fd, request, strlen(request));

				if ( (n = Readn(fd, reply, nbytes)) != nbytes)
					err_quit("server returned %d bytes", n);

				Close(fd);*/		/* TIME_WAIT on client, not server */
			}
			my_lock_wait();
			printf("child %d done\n", i);
			my_lock_release();
			sleep(10);
			exit(0);
		}
		/* parent loops around to fork() again */
	}

	while (wait(NULL) > 0)	/* now parent waits for all children */
		;
	if (errno != ECHILD)
		err_sys("wait error");
	printf("all child: %d\n", count);
	exit(0);
}
int
main(int argc, char *argv[])
{
     int listenfd, i;
     socklen_t addrlen;
     void sig_int(int);
     pid_t child_make(int, int,int);
     void my_lock_init(char *);
     void my_lock_wait();
     void my_lock_release();



     

     if (argc == 3) {
          listenfd = Tcp_listen(NULL, argv[1], &addrlen);
     }
     if (argc == 4) {
          listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
          
     }
     if (argc != 3 && argc != 4) {
          err_quit("usage: prefork_server01 [<host>] <port#> <#children>");
     }

     nchildren = atoi(argv[argc-1]);

     pids = Calloc(nchildren, sizeof(pid_t));

     my_lock_init("/tmp/lock.XXXXXX");

     for (i=0 ;i < nchildren ;i++  ) {
          pids[i] = child_make(i, listenfd, addrlen);
          
     }

     Signal(SIGINT, sig_int);

     for ( ;   ;  ) {
          pause();              /* 実際の処理は子プロセスが行う */
          
     }

     return 0;
}
예제 #5
0
void mpm_prefork()
{
    int listenfd,  i;
    char listen[6];
    sprintf(listen,  "%d", config->Listen);
    socklen_t addrlen;
    void sig_int(int);
    pid_t child_make(int, int, int);
    listenfd = Tcp_listen(NULL, listen, &addrlen);
    nchildren = config->StartServers;
    pids = calloc(nchildren, sizeof(pid_t));

    my_lock_init("/tmp/lock.server");
    for (i = 0; i < nchildren; i++)
        pids[i] = child_make(i, listenfd, addrlen);
				Signal(SIGTERM, sig_int);
    for ( ; ; )
        pause();
}
예제 #6
0
int main(int argc, char **argv)
{
    int fd, i, num_loop, zero = 0;
    char c, lock_f[128];
    struct stat st;
    int *iptr;
    char *cptr;

    if(argc != 4) {
        printf("usage: %s <pathname> <loop number> <char>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if(is_int(argv[2]))
        num_loop = atoi(argv[2]);

    c = argv[3][0];

    i = stat(argv[1], &st); /* first one will get -1*/

    snprintf(lock_f, sizeof(lock_f), "%s.lock", argv[1]);

    if((fd = open(argv[1], O_RDWR | O_CREAT, F_MODE)) < 0) {
        perror("open() failed\n");
        exit(EXIT_FAILURE);
    }

    if(i == -1) { /* initialze */
        write(fd, &zero, sizeof(int)); /* int counter*/
        for(i = 0; i < SIZE; i++) {
            write(fd, &zero, 1);
        }
    }

    iptr = (int *)mmap(NULL, SIZE+sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    if(iptr == MAP_FAILED) {
        perror("mmap failed\n");
        exit(EXIT_FAILURE);
    }

    close(fd); /* POSIX recommendation */

    cptr = (char *)(&iptr[1]);

    my_lock_init(lock_f);
    setbuf(stdout, NULL); /* stdout unbuffer */

    for(i = 0; i < num_loop; i++) {
        my_lock_wait();

        if(*iptr >= (SIZE-1)) {
            my_lock_release();
            exit(EXIT_SUCCESS);
        }

        //
        for ( ; ; ) {
            if ((cptr[*iptr - 1]) == c && *iptr != 0) {
                my_lock_release();
                usleep(100);
                my_lock_wait();
            } else {
                break;
            }
        }

        cptr[*iptr] = c;
        printf("%c: %d\n", c, (*iptr)++);
        my_lock_release();
        // usleep(800000);
    }

    return 0;
}