示例#1
0
void run() {
  pid_t pid;
  int i;
  struct sembuf inc[2] = {{0, a_size/2, 0}, {1, a_size/2, 0}};
  
  x_semop(semid, &inc[0], 1);

  for(i = 0; i < a_size/2; i++) {
    pid = x_fork();

    if(ISCHILD(pid)) {
      run_comparator(i, cascades);
      exit(0);
    }
  }

  i = 0;
  while(13) {
    x_semop(semid, &swait[i%2], 1);
    x_semop(semid, &inc[(i + 1)%2], 1);
    
    i++;
    if(cascades == i) {
      break;
    }
  }
}
示例#2
0
int daemon_init(const char *pname, int facility)
{
    int i;
    pid_t pid;

    if ( (pid = x_fork()) < 0)
        return (-1);
    else if (pid)
        _exit(0);                       /* parent terminates */
/* child 1 continues...  */
    if (setsid() < 0)                  /* become session leader */
        return (-1);

    Signal(SIGHUP, SIG_IGN);
    if ( (pid = x_fork()) < 0)
        return (-1);
    else if (pid)
        _exit(0);                      /* child 1 terminates  */
    
/* child 2 continues...  */
    daemon_proc = 1;                   /* for err_XXX() functions */

    chdir("/");                        /* change working directory */
/* close off file descriptors  */
    for (i = 0; i < MAXFD; i++)
        close(i);

/* redirect stdin , stdout , and stderr to .dev/null */
    open("/dev/null", O_RDONLY);
    open("/dev/null", O_RDWR);
    open("/dev/null", O_RDWR);

    openlog(pname, LOG_PID, facility);

    return (0);                          /* sucess */
}                               
示例#3
0
文件: shm_malloc.c 项目: y0ma/sysprog
void run_test() {
  int n;
  pid_t pid;

  n = NUM_PROC;
  while(n-- > 0) {
    pid = x_fork();
    
    if(IS_CHILD(pid)) {
      // do something;
      test_routine();

      exit(0);
    }
  }

  n = NUM_PROC;
  while(n-- > 0) {
    pid = x_wait(NULL);
    //printf("Done: %d\n", pid);
  }
}
示例#4
0
文件: runbc.c 项目: y0ma/sysprog
int main(void) {
  int in[2];
  int out[2];
  pid_t pid;

  printf("type 'quit' for exit\n\n");

  x_pipe(in);
  x_pipe(out);
  
  pid = x_fork();
  
  if(IS_CHILD(pid)) {
    x_dup2(in[READ], STDIN_FD);
    x_dup2(out[WRITE], STDOUT_FD);
    
    x_close(in[READ]);
    x_close(in[WRITE]);
    x_close(out[READ]);
    x_close(out[WRITE]);
    
    execl("/usr/bin/bc", "runbc", NULL);

    perror("execl");
    exit(1);
  } else if(IS_PARENT(pid)) {
    char buf[BUFSIZE + 1];
    fd_set rfds;
    int count;
    int flag = 1;

    x_close(in[READ]);
    x_close(out[WRITE]);
    
    while(13) {
      FD_ZERO(&rfds);
      FD_SET(STDIN_FD, &rfds);
      FD_SET(out[READ], &rfds);
      
      count = 0;

      x_select(out[READ] + 1, &rfds, NULL, NULL, NULL);

      if(FD_ISSET(out[READ], &rfds)) {
        // read messages from BC
        count = x_read(out[READ], buf, BUFSIZE);
        if(count) {
          x_write(STDOUT_FD, buf, count);
        } else {
          break;
        }
      }

      if(FD_ISSET(STDIN_FD, &rfds) && flag) {
        // send commands to BC
        count = x_read(STDIN_FD, buf, BUFSIZE);
        if(count) {
          x_write(in[WRITE], buf, count);
        } else {
          x_write(in[WRITE], "quit\n", 6);
          flag = 0;
        }
      }
    }

    x_waitpid(pid, NULL, 0);

    x_close(in[WRITE]);
    x_close(out[READ]);
  }

  return 0;
}