socsvn commit: r255155 - soc2013/dpl
dpl at FreeBSD.org
dpl at FreeBSD.org
Thu Jul 25 11:02:18 UTC 2013
Author: dpl
Date: Thu Jul 25 11:02:17 2013
New Revision: 255155
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255155
Log:
We now have a working child process that is ready to get commands and send the results.
We still have to design the basic protocol, but it will be done reading and writing from/to buf.
Modified:
soc2013/dpl/caller.c
Modified: soc2013/dpl/caller.c
==============================================================================
--- soc2013/dpl/caller.c Thu Jul 25 10:29:40 2013 (r255154)
+++ soc2013/dpl/caller.c Thu Jul 25 11:02:17 2013 (r255155)
@@ -7,76 +7,94 @@
#include <signal.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
-int childpid = 0;
-int sv[2], buf[1024], i;
-int buf[1024];
-
-void listenAndServe();
-void setChildSignals();
-void getCommand();
-void sendCommand(int, int *);
-void gotIO(int);
-int startChild();
+pid_t child = 0;
+int sv[2], i;
+int buf[32];
+
+pid_t startChild();
+void worker();
+void setSignals();
+void waitCommand();
+void * command();
+void killChild();
int
main()
{
- int sv;
- if(childpid == 0)
- sv = startChild();
- sendCommand(0, buf);
+ if(child == 0)
+ child = startChild();
+ if(child < 0){
+ perror("error");
+ exit(1);
+ }
+
+ atexit(killChild);
+ printf("buf:\n");
+ for( i=0; i<32; ++i){
+ printf("%d\t", buf[i]);
+ if( (i+1) % 8 == 0 )
+ printf("\n");
+ }
return 0;
}
int startChild()
{
- int buf[10] = { 0,1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ bzero(&buf, sizeof(buf));
if( socketpair(PF_LOCAL, SOCK_STREAM, 0, sv) < 0 )
return -1;
- if( (childpid = fork()) == -1 ) {
+ if( (child = fork()) == -1 ) {
return -1;
- } else if (childpid == 0){
- struct pollfd fds[1];
- int buf[1], p;
-
- cap_rights_limit(STDIN_FILENO, CAP_WRITE);
- close(STDIN_FILENO);
- close(STDERR_FILENO);
-
- setChildSignals();
-
- fds[0].fd = sv[1];
- fds[0].events = POLLIN;
- fds[0].revents = 0;
- while( (p = poll(fds, 1, -1)) > 0 )
- printf("Received: %d\n", read(sv[1], buf, sizeof(int)));
- printf("Poll has returned: %d\n", p);
- } else {
- for( i=0; i<10; i++){
- printf("sending: %d\n", buf[i]);
- write(sv[0], (void *)buf[i], sizeof(int));
- }
+ } else if (child == 0){
+ worker();
}
- return sv[0];
+ return child;
}
-void setChildSignals()
-{
-
+void worker(){
+ cap_rights_limit(STDIN_FILENO, CAP_WRITE);
+ close(STDIN_FILENO);
+ close(STDERR_FILENO);
+
+ waitCommand();
}
+
/* Wait for commands, and execute them */
-void listenAndServe()
+void
+waitCommand()
{
-
+ int p;
+ pid_t pid;
+ struct pollfd fds[1];
+ fds[0].fd = sv[1];
+ fds[0].events = POLLIN|POLLPRI|POLLOUT;
+ fds[0].revents = 0;
+
+ while(1) {
+ if ((p = poll(fds, 1, 0)) > 0){
+ if( fds[0].revents & POLLIN || fds[0].revents & POLLPRI){
+ read(sv[1], buf, sizeof(buf));
+ } else if( fds[0].revents & POLLOUT) {
+ }
+ }
+ }
+ printf("Child's out of while.\n");
}
-void sendCommand(int c, int *buf){
+void *
+command(){
+ return NULL;
}
-void getCommand(){
-
+void
+killChild()
+{
+ printf("About to kill %d\n", child);
+ kill(child, SIGINT);
}
\ No newline at end of file
More information about the svn-soc-all
mailing list