BBS水木清华站∶精华区
发信人: althea (稻草人), 信区: Linux
标 题: [part 2] epserver.c
发信站: BBS 水木清华站 (Fri Dec 29 23:46:59 2000)
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
#define MAX_NAME_LENGTH 64
#define DISPLAY_LENGTH 64
char socket_file_name[MAX_NAME_LENGTH];
int make_named_socket (const char *filename)
{
struct sockaddr_un name;
int sock;
size_t size;
/* Create the socket. */
sock = socket (PF_LOCAL, SOCK_DGRAM, 0);
if (sock < 0)
{
perror ("socket");
exit (EXIT_FAILURE);
}
/* Bind a name to the socket. */
name.sun_family = AF_LOCAL;
strncpy (name.sun_path, filename, sizeof (name.sun_path));
size = SUN_LEN (&name);
if (bind (sock, (struct sockaddr *) &name, size) < 0)
{
perror ("bind");
exit (EXIT_FAILURE);
}
return sock;
}
void delete_socket (int sig)
{
signal (sig, SIG_DFL);
unlink (socket_file_name);
kill (getpid (), sig);
}
void handle_signals ()
{
signal (SIGHUP, delete_socket);
signal (SIGINT, delete_socket);
signal (SIGQUIT, delete_socket);
signal (SIGILL, delete_socket);
signal (SIGTRAP, delete_socket);
signal (SIGABRT, delete_socket);
signal (SIGFPE, delete_socket);
signal (SIGSEGV, delete_socket);
signal (SIGTERM, delete_socket);
}
int main ()
{
int status, socket, nbytes;
char display_name[DISPLAY_LENGTH];
snprintf (socket_file_name, MAX_NAME_LENGTH, "/tmp/ep-%d", (int) geteuid());
handle_signals ();
socket = make_named_socket(socket_file_name);
while (1) {
if ((nbytes = read (socket, display_name, DISPLAY_LENGTH)) < 0) {
if (nbytes == EINTR) continue;
perror ("read");
exit (EXIT_FAILURE);
}
write (STDOUT_FILENO, display_name, nbytes);
}
return 0;
}
--
Look Ma, this man can twist his fingers as if they were made of rubber,
isn't that amazing? -- Not really, he's been using emacs for years...!
※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.203.100]
BBS水木清华站∶精华区