From owner-FreeBSD-users-jp@jp.freebsd.org  Wed Oct 17 20:57:42 2001
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id UAA08314;
	Wed, 17 Oct 2001 20:57:42 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from pfeifer.hameln.priv (h135-001.tokyu-net.catv.ne.jp [210.149.135.1])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with SMTP id UAA08309
	for <FreeBSD-users-jp@jp.freebsd.org>; Wed, 17 Oct 2001 20:57:40 +0900 (JST)
	(envelope-from ikeyan@arizona.ne.jp)
Received: (qmail 29747 invoked by uid 0); 17 Oct 2001 11:57:09 -0000
Received: from localhost (127.0.0.1)
  by localhost with SMTP; 17 Oct 2001 11:57:09 -0000
Date: Wed, 17 Oct 2001 20:57:09 +0900 (JST)
Message-Id: <20011017.205709.42769252.ikeyan@arizona.ne.jp>
To: FreeBSD-users-jp@jp.freebsd.org
From: "IKEMOTO Masahiro" (=?iso-2022-jp?B?GyRCQ1NLXD47OTAbKEI=?=)
 <ikeyan@arizona.ne.jp>
In-Reply-To: <3BCD60EB.63568.001@odin.j.asahi-net.or.jp>
References: <3BCD60EB.63568.001@odin.j.asahi-net.or.jp>
X-Face: %.q&rD\,u}**pW@),dz$53CF8%Ll,i++T{qFaYyVA$*wIN}`XoC[~jAp0=PSB-m^\kARQ0;
 i~?4kWYjzEuW"q<QF8&vku)=xCsuDk=6@w~En'<
X-URL: http://www.arizona.ne.jp/
X-Mailer: Mew version 2.0.57 on Emacs 20.7 / Mule 4.1 (AOI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+010328
X-Sequence: FreeBSD-users-jp 64905
Subject: [FreeBSD-users-jp 64905] pthread & network daemon (Re: pthread
 =?ISO-2022-JP?B?GyRCJSolVyU3JWclcyRyJEQkMSRrJEglUCU5JSgbKEI=?=
 =?ISO-2022-JP?B?GyRCJWkhPBsoQg==?=)
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org
X-Originator: ikeyan@arizona.ne.jp

$B$$$1$b$H$G$9(B.

pthread$B$NOC$,=P$F$$$k$N$G(B, $BJX>h<ALd$J$N$G$9$,(B,

$BE=$jIU$1$F$"$k%=!<%9$O(B, $BAw$i$l$F$-$?J8;zNs$rAw$jJV$9$H$$$&(B, $BC1=c$J%G!<(B
$B%b%s%W%m%0%i%`$G$9(B. $B=hM}$NB?=E2=$r(B, pthread$B$G9T$C$F$$$^$9(B.

$B$3$N%W%m%0%i%`$O(B, $B$3$N$^$^(B cc -pthread $B$G%3%s%Q%$%k$9$k$H(B, $B4|BT$I$*$j(B
$B$KF0:n$9$k$N$G$9$,(B,

---
% ./a.out&
[1] 29685

% telnet localhost 10000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello     
hello
world
world
^]
telnet> q
Connection closed.
---

$BFs=E(Bfork$B$7$F(B, $B<+F0E*$KN"$K1#$l$k$h$&$K$9$k%3!<%I(B

---
  /*
  if (daemon(s) < 0) {
    fprintf(stderr, "Daemonize failed.\n");
    exit(1);
  }
  */
---

$B$NItJ,$r@8$+$9$H(B, $B@\B3$7$FJ8;zNs$rAw?.$7$F$bH?1~$7$J$/$J$j$^$9(B.

$BF1$8%W%m%0%i%`$r(BRedHat Linux 6.2$B$GF0:n$5$;$F$_$?$N$G$9$,(B, $B$3$A$i$O$-$A(B
$B$s$H4|BT$I$*$j$NF0:n$r$7$F$$$^$9(B.

$B%W%m%0%i%`$,4V0c$C$F$$$k$N$+(B, FreeBSD$B$N(Bpthread$B$K860x$,$"$k$N$+$h$/$o$+(B
$B$i$J$$$N$G(B, $B3'MM$N$*CN7C$r<Z$j$?$$$H;W$C$F$$$^$9(B.

$B$3$A$i$G%F%9%H$K;HMQ$7$F$$$k4D6-$O(B, $B:G6a$N(BFreeBSD-5.0-CURRENT$B$G$9(B.
$B$I$&$>$h$m$7$/$*4j$$CW$7$^$9(B.


$B0J2<(B, $B%=!<%9%3!<%I$G$9(B.

===
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>


int socket_new(short port) {
  int s;
  struct sockaddr_in sin;
  socklen_t addrlen;
  int opt;

  if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
    fprintf(stderr, "failed to create socket: %s\n", strerror(errno));
    return -1;
  }

  opt = 1;
  if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
    fprintf(stderr, "failed to set socket option: %s\n", strerror(errno));
    return -1;
  }

  memset(&sin, 0, addrlen = sizeof(sin));
  sin.sin_family = AF_INET;
  sin.sin_port = htons(port);
  sin.sin_addr.s_addr = INADDR_ANY;

  if (bind(s, (struct sockaddr *)&sin, addrlen) < 0) {
    fprintf(stderr, "failed to bind the socket: %s\n", strerror(errno));
    return -1;
  }

  if (listen(s, 5) < 0) {
    fprintf(stderr, "failed to listen the socket: %s\n", strerror(errno));
    return -1;
  }
  return s;
}

int myfork() {
  switch (fork()) {
  case 0:
    return 0;
  case -1:
    return -1;
  default:
    exit(0);
  }
}

void closeall(int fd) {
  int fdlimit = sysconf(_SC_OPEN_MAX);
  int nfd;

  if ((nfd = open("/dev/tty", O_RDWR)) >= 0) {
    ioctl(nfd, TIOCNOTTY);
    close(nfd);
  }

  for (nfd = 3; nfd < fd; nfd++)
    close(nfd);
  for (nfd++; nfd < fdlimit; nfd++)
    close(nfd);

  nfd = open("/dev/null", O_RDWR);
  dup2(0, nfd); dup2(1, nfd); dup2(2, nfd);
  close(nfd);
}

int daemon(int s) {
  int s;
  if ((myfork() < 0) || (myfork() < 0))
    return -1;

  if ((s = setsid()) < 0)
    return -1;

  chdir("/");
  closeall(s);

  return 0;
}

void *func(void *param) {
  int s;
  ssize_t len;
  char buf[1024];

  s = (int)param;

  while ((len = recv(s, buf, 1024, 0)) > 0)
    send(s, buf, len, 0);

  return NULL;
}


int main(int argc, char **argv) {
  int s;
  struct sockaddr_in sin;
  socklen_t addrlen;
  pthread_t worker;
  int rc;

  if ((s = socket_new(10000)) < 0) {
    fprintf(stderr, "Socket open failed.\n");
    exit(1);
  }

  /*
  if (daemon(s) < 0) {
    fprintf(stderr, "Daemonize failed.\n");
    exit(1);
  }
  */

  for (;;) {
    addrlen = sizeof(sin);
    rc = accept(s, (struct sockaddr *)&sin, &addrlen);

    if (rc >= 0) {
      if (pthread_create(&worker, NULL, func, (void *)rc) != 0) {
	close(rc);
	continue;
      }
      pthread_detach(worker);
    }
  }
  return 0;
}
===

-- 
IKEMOTO, Masahiro/Arizona Design Inc.

* mailto:ikeyan@arizona.ne.jp
* http://www.arizona.ne.jp/
