diff options
author | LAN-TW <lantw44@gmail.com> | 2013-11-13 01:21:11 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2013-11-13 01:22:18 +0800 |
commit | 15d0398e07b2a2d25bd5aeae1be2fb30d9a9665b (patch) | |
tree | 36b587a3b27cfefb967229a7dee26432c2007e30 | |
parent | 2846470b91d6f76f93e2b0e674fbd310470dec1b (diff) | |
download | sp2013-15d0398e07b2a2d25bd5aeae1be2fb30d9a9665b.tar.gz sp2013-15d0398e07b2a2d25bd5aeae1be2fb30d9a9665b.tar.zst sp2013-15d0398e07b2a2d25bd5aeae1be2fb30d9a9665b.zip |
HW2: judge 現在可以建立與刪除 FIFO 檔案了
-rw-r--r-- | hw2/big_judge.c | 2 | ||||
-rw-r--r-- | hw2/judge.c | 53 | ||||
-rw-r--r-- | hw2/xwrap.c | 22 | ||||
-rw-r--r-- | hw2/xwrap.h | 32 |
4 files changed, 93 insertions, 16 deletions
diff --git a/hw2/big_judge.c b/hw2/big_judge.c index 507f2b8..c7103f0 100644 --- a/hw2/big_judge.c +++ b/hw2/big_judge.c @@ -39,7 +39,7 @@ bool comb4 (Comp135* comp, int players[], long player_num) { } int main (int argc, char* argv[]) { - if (argc < 2) { + if (argc < 3) { fprintf (stderr, "Usage: %s judge_num player_num\n", argv[0]); return 1; } diff --git a/hw2/judge.c b/hw2/judge.c new file mode 100644 index 0000000..141f359 --- /dev/null +++ b/hw2/judge.c @@ -0,0 +1,53 @@ +/* b01902062 藍挺瑋 */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "logger.h" +#include "xwrap.h" + +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +int main (int argc, char* argv[]) { + if (argc < 2) { + fprintf (stderr, "Usage: %s judge_id\n", argv[0]); + return 1; + } + + const char* judgename = argv[1]; + char* fifoname[5] = { + xstrcat ("judge", judgename, ".FIFO", NULL), + xstrcat ("judge", judgename, "_A.FIFO", NULL), + xstrcat ("judge", judgename, "_B.FIFO", NULL), + xstrcat ("judge", judgename, "_C.FIFO", NULL), + xstrcat ("judge", judgename, "_D.FIFO", NULL) + }; + + for (int i = 0; i < ARRAY_LEN (fifoname, char*); i++) { + if (mkfifo (fifoname[i], S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) < 0) { + fprintf (stderr, "%s: cannot create FIFO `%s\': %s", + argv[0], fifoname[i], strerror (errno)); + return 2; + } + } + + Comp135 comp_struct, *comp; + comp = &comp_struct; + + comp135_init (comp, argv[0], false); + + + comp135_destroy (comp); + + for (int i = 0; i < ARRAY_LEN (fifoname, char*); i++) { + unlink (fifoname[i]); + free (fifoname[i]); + } + + return 0; +} diff --git a/hw2/xwrap.c b/hw2/xwrap.c index 4ce48ab..8c12873 100644 --- a/hw2/xwrap.c +++ b/hw2/xwrap.c @@ -267,3 +267,25 @@ char* xgetres (const char* filename) { return myres; } + +size_t xwrite (int fd, const char* str, size_t size) { + ssize_t wtn = 0; + if (size <= 0) { + size = strlen (str); + } + size_t rem = size; + while (rem > 0) { + wtn = write (fd, str, rem); + if (wtn < 0) { + if (errno != EINTR && errno != EAGAIN) { + break; + } + continue; + } + str += wtn; + rem -= wtn; + } + + rem = rem > 0 ? rem : 0; + return size - rem; +} diff --git a/hw2/xwrap.h b/hw2/xwrap.h index 1c0d682..7759ae9 100644 --- a/hw2/xwrap.h +++ b/hw2/xwrap.h @@ -5,22 +5,24 @@ #include <stdlib.h> #define STATIC_STRLEN(x) (sizeof(x)/sizeof(char) - 1) +#define ARRAY_LEN(x,t) (sizeof(x)/sizeof(t)) -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); +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); +size_t xwrite (int fd, const char* str, size_t size); static inline int xmax (int a, int b) { return a > b ? a : b; |