summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2013-11-05 22:39:13 +0800
committerLAN-TW <lantw44@gmail.com>2013-11-05 22:39:13 +0800
commit0750f329918ff6fa2e0169f7687ce6ec5b796efb (patch)
tree83985ba65844b3e1d09b3c6fab652ddfcb5bea19
parent259a2c1113be7b4998c76f6ff1298881e54746d7 (diff)
downloadsp2013-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.c59
-rw-r--r--hw2/logger.c9
-rw-r--r--hw2/xwrap.c115
-rw-r--r--hw2/xwrap.h9
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;