summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2013-11-13 01:21:11 +0800
committerLAN-TW <lantw44@gmail.com>2013-11-13 01:22:18 +0800
commit15d0398e07b2a2d25bd5aeae1be2fb30d9a9665b (patch)
tree36b587a3b27cfefb967229a7dee26432c2007e30
parent2846470b91d6f76f93e2b0e674fbd310470dec1b (diff)
downloadsp2013-15d0398e07b2a2d25bd5aeae1be2fb30d9a9665b.tar.gz
sp2013-15d0398e07b2a2d25bd5aeae1be2fb30d9a9665b.tar.zst
sp2013-15d0398e07b2a2d25bd5aeae1be2fb30d9a9665b.zip
HW2: judge 現在可以建立與刪除 FIFO 檔案了
-rw-r--r--hw2/big_judge.c2
-rw-r--r--hw2/judge.c53
-rw-r--r--hw2/xwrap.c22
-rw-r--r--hw2/xwrap.h32
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;