diff options
author | LAN-TW <lantw44@gmail.com> | 2013-11-05 22:39:13 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2013-11-05 22:39:13 +0800 |
commit | 0750f329918ff6fa2e0169f7687ce6ec5b796efb (patch) | |
tree | 83985ba65844b3e1d09b3c6fab652ddfcb5bea19 | |
parent | 259a2c1113be7b4998c76f6ff1298881e54746d7 (diff) | |
download | sp2013-0750f329918ff6fa2e0169f7687ce6ec5b796efb.tar sp2013-0750f329918ff6fa2e0169f7687ce6ec5b796efb.tar.gz sp2013-0750f329918ff6fa2e0169f7687ce6ec5b796efb.tar.bz2 sp2013-0750f329918ff6fa2e0169f7687ce6ec5b796efb.tar.lz sp2013-0750f329918ff6fa2e0169f7687ce6ec5b796efb.tar.xz sp2013-0750f329918ff6fa2e0169f7687ce6ec5b796efb.tar.zst sp2013-0750f329918ff6fa2e0169f7687ce6ec5b796efb.zip |
HW2: 準備好一些基本的東西
-rw-r--r-- | hw2/big_judge.c | 59 | ||||
-rw-r--r-- | hw2/logger.c | 9 | ||||
-rw-r--r-- | hw2/xwrap.c | 115 | ||||
-rw-r--r-- | hw2/xwrap.h | 9 |
4 files changed, 189 insertions, 3 deletions
diff --git a/hw2/big_judge.c b/hw2/big_judge.c index fbb21cf..507f2b8 100644 --- a/hw2/big_judge.c +++ b/hw2/big_judge.c @@ -6,10 +6,25 @@ #include "logger.h" #include "xwrap.h" +#include <errno.h> #include <stdbool.h> #include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <unistd.h> -bool comb4 (Comp135* comp, int players[], int player_num) { +typedef struct { + pid_t pid; + int read; + int write; +} JudgeData; + +typedef struct { + long score; +} PlayerData; + +bool comb4 (Comp135* comp, int players[], long player_num) { for (int i = 3; i >= 0; i--) { if (players[i] + 1 <= player_num && players[i] + 1 + (3 - i) <= player_num) { @@ -54,7 +69,49 @@ int main (int argc, char* argv[]) { comp135_init (comp, argv[0], false); + JudgeData* jd = xmalloc (sizeof (JudgeData) * judge_num); + PlayerData* pd = xmalloc (sizeof (PlayerData) * player_num); + + for (int i = 0; i < player_num; i++) { + pd[i].score = 0; + } + for (int i = 0; i < judge_num; i++) { + int fdr[2], fdw[2]; + if (pipe (fdr) < 0) { + fprintf (stderr, "%s: pipe: %s\n", argv[0], strerror (errno)); + return 4; + } + if (pipe (fdw) < 0) { + fprintf (stderr, "%s: pipe: %s\n", argv[0], strerror (errno)); + return 4; + } + + jd[i].pid = fork (); + if (jd[i].pid < 0) { + fprintf (stderr, "%s: fork: %s\n", argv[0], strerror (errno)); + return 5; + } else if (jd[i].pid > 0) { + close (fdr[1]); + close (fdw[0]); + } else { + close (fdr[0]); + close (fdw[1]); + char* myjudge = xgetres ("judge"); + execl (myjudge, "judge", xsprintf ("%d", i + 1), NULL); + fprintf (stderr, "%s: execl: %s: %s\n", argv[0], myjudge, strerror (errno)); + _exit (1); + } + + jd[i].read = fdr[0]; + jd[i].write = fdw[1]; + comp135_log (comp, "Judge %d created: PID = %u, read = %d, write = %d", + i + 1, jd[i].pid, jd[i].read, jd[i].write); + } + int players[4] = {1, 2, 3, 4}; + do { + + } while (comb4 (comp, players, player_num)); comp135_destroy (comp); diff --git a/hw2/logger.c b/hw2/logger.c index bffe50b..b426d40 100644 --- a/hw2/logger.c +++ b/hw2/logger.c @@ -22,7 +22,12 @@ void comp135_init (Comp135* comp, const char* static_name, bool no_init) { tzset (); } - comp->name = (char*)static_name; + comp->name = strrchr (static_name, '/'); + if (comp->name == NULL) { + comp->name = (char*)static_name; + } else { + comp->name++; + } comp->pid = getpid (); comp->debug = false; @@ -96,7 +101,7 @@ void comp135_log (Comp135* comp, const char* format, ...) { fcntl (comp->log_fd, F_SETLKW, &lock_info); fprintf (comp->log_file, - "%04d-%02d-%02d %02d:%02d:%02d %s [%d]: ", + "%04d-%02d-%02d %02d:%02d:%02d %s[%d]: ", tmd.tm_year + 1900, tmd.tm_mon + 1, tmd.tm_mday, tmd.tm_hour, tmd.tm_min, tmd.tm_sec, comp->name, comp->pid); diff --git a/hw2/xwrap.c b/hw2/xwrap.c index 3c3127d..ca6c315 100644 --- a/hw2/xwrap.c +++ b/hw2/xwrap.c @@ -5,10 +5,14 @@ #include "xwrap.h" #include <errno.h> +#include <fcntl.h> #include <stdarg.h> +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/stat.h> +#include <sys/types.h> #include <time.h> #include <unistd.h> @@ -60,6 +64,21 @@ void* xrealloc (void* ptr, size_t size) { return newptr; } +bool xstrend (const char* str, const char* suffix) { + size_t len = strlen (str); + size_t suflen = strlen (suffix); + int i, j; + for (i = len - 1, j = suflen - 1; i >= 0 && j >= 0; i--, j--) { + if (str[i] != suffix[j]) { + return false; + } + } + if (i < 0 && j >= 0) { + return false; + } + return true; +} + char* xstrcat (const char* str, ...) { va_list ap; char* strp; @@ -115,6 +134,56 @@ char* xsprintf (const char* format, ...) { return newstr; } +int xfaddfd (int fd, int fdflags) { + int orgfd = fcntl (fd, F_GETFD); + if (orgfd < 0) { + return -1; + } + return fcntl (fd, F_SETFD, orgfd | fdflags); +} + +int xfdelfd (int fd, int fdflags) { + int orgfd = fcntl (fd, F_GETFD); + if (orgfd < 0) { + return -1; + } + return fcntl (fd, F_SETFD, orgfd & ~(fdflags)); +} + +int xfaddfl (int fd, int flflags) { + int orgfl = fcntl (fd, F_GETFL); + if (orgfl < 0) { + return -1; + } + return fcntl (fd, F_SETFL, orgfl | flflags); +} + +int xfdelfl (int fd, int flflags) { + int orgfl = fcntl (fd, F_GETFL); + if (orgfl < 0) { + return -1; + } + return fcntl (fd, F_SETFL, orgfl & ~(flflags)); +} + +char* xreadlink (const char* filename) { + struct stat st; + if (lstat (filename, &st) < 0) { + return NULL; + } + char* buf = malloc (st.st_size + 1); + if (buf == NULL) { + return NULL; + } + ssize_t written = readlink (filename, buf, st.st_size); + if (written < 0) { + free (buf); + return NULL; + } + buf[written] = '\0'; + return buf; +} + char* xgetcwd (void) { char *cwd, *result; size_t size = pathconf (".", _PC_PATH_MAX); @@ -129,3 +198,49 @@ char* xgetcwd (void) { return cwd; } + +char* xgetexe (void) { + char* myexec; + + if ((myexec = xreadlink ("/proc/self/exe")) != NULL) { + return myexec; + } + if ((myexec = xreadlink ("/proc/curproc/exe")) != NULL) { + return myexec; + } + if ((myexec = xreadlink ("/proc/curproc/file")) != NULL) { + return myexec; + } + + return NULL; +} + +char* xgetres (const char* filename) { + char *myexec, *myres; + bool myexec_static = false; + + myexec = xgetexe (); + if (myexec == NULL) { + myexec = xgetcwd (); + if (myexec == NULL) { + myexec = "./"; + myexec_static = true; + } + } else { + char* dirsep = strrchr (myexec, '/'); + if (dirsep != NULL && dirsep != myexec) { + *dirsep = '\0'; + } + } + + if (xstrend (myexec, "/")) { + myres = xstrcat (myexec, filename, NULL); + } else { + myres = xstrcat (myexec, "/", filename, NULL); + } + if (!myexec_static) { + free (myexec); + } + + return myres; +} diff --git a/hw2/xwrap.h b/hw2/xwrap.h index ca7fee4..1c0d682 100644 --- a/hw2/xwrap.h +++ b/hw2/xwrap.h @@ -1,6 +1,7 @@ #ifndef X_GENERAL_WRAPPER #define X_GENERAL_WRAPPER +#include <stdbool.h> #include <stdlib.h> #define STATIC_STRLEN(x) (sizeof(x)/sizeof(char) - 1) @@ -8,10 +9,18 @@ int xatol (const char* str, long* result); void* xmalloc (size_t size); void* xrealloc (void* ptr, size_t size); +bool xstrend (const char* str, const char* suffix); char* xstrcat (const char* str, ...); char* xstrdup (const char* str); char* xsprintf (const char* format, ...); +int xfaddfd (int fd, int fdflags); +int xfdelfd (int fd, int fdflags); +int xfaddfl (int fd, int flflags); +int xfdelfl (int fd, int flflags); +char* xreadlink (const char* filename); char* xgetcwd (void); +char* xgetexe (void); +char* xgetres (const char* filename); static inline int xmax (int a, int b) { return a > b ? a : b; |