Пример #1
0
int main(int argc, char* argv[]) {
  const size_t MAX_ARRAY_SIZE = 100000;
  size_t numbers[MAX_ARRAY_SIZE];
  size_t counter = 0;
  int NumberOfInts = 0;
  for(counter = 0; counter < MAX_ARRAY_SIZE; ++counter) {
    numbers[counter] = 0;
  }
  if(argc != 2) {
    printf("usage sortrandom NUMBER\n");
    exit(EXIT_FAILURE);
  }
  sscanf(argv[1], "%d", &NumberOfInts);
  if(( NumberOfInts <= 0) || (NumberOfInts >= (MAX_ARRAY_SIZE + 1))) {
    printf("usage sortrandom NUMBER\n");
    printf("NUMBER must between 1 and %li\n", MAX_ARRAY_SIZE);
    exit(EXIT_FAILURE);
  }
  #ifdef PRINTRANDOM
  printrandoms(numbers, NumberOfInts);
  #endif
  mkrandom(numbers, NumberOfInts);
  #ifdef PRINTRANDOM
  printrandoms(numbers, NumberOfInts);
  #endif
  if(NumberOfInts > 2) {
    /* A single number is already sorted */
    sort(numbers, NumberOfInts);
  }
  #ifdef PRINTRANDOM
  printf("\n");
  printrandoms(numbers, NumberOfInts);
  #endif
  exit(EXIT_SUCCESS);
}
Пример #2
0
int main(int argc, char ** argv) {
  if (argc < 2) {
    fprintf(stderr,
	    "%s: message queue tool for the prll() shell function.\n"
	    "Consult the prll source and documentation for usage.\n"
	    "Not meant to be used standalone.\n"
	    , argv[0]);
    return 1;
  }

  // Choosing operating mode
  enum {
    PRLL_CLIENT_MODE, PRLL_REMOVE_MODE,
    PRLL_GETONE_MODE, PRLL_CREATE_MODE,
    PRLL_TEST_MODE
  } mode;
  if (argv[1][0] == '\0')
    goto arg_err;
  if (argv[1][0] == 'r' && argv[1][1] == '\0')
    mode = PRLL_REMOVE_MODE;
  else if (argv[1][0] == 'c' && argv[1][1] == '\0')
    mode = PRLL_CLIENT_MODE;
  else if (argv[1][0] == 'o' && argv[1][1] == '\0')
    mode = PRLL_GETONE_MODE;
  else if (argv[1][0] == 'n' && argv[1][1] == '\0')
    mode = PRLL_CREATE_MODE;
  else if (argv[1][0] == 't' && argv[1][1] == '\0')
    mode = PRLL_TEST_MODE;
  else if (argv[1][0] == 'P' && argv[1][1] == '\0') {
    if (argc < 3) {
      fprintf(stderr, "%s: Not enough parameters.\n", argv[0]);
      return 1;
    }
    FILE* out = fopen(argv[2], "w");
    if (!out) {
      fprintf(stderr, "%s: Could not open tasks file.\n", argv[0]);
      return 1;
    }
    fprintf(out, "%lld\n", (long long)getppid());
    fclose(out);
    return 0;
  } else {
  arg_err:
    fprintf(stderr, "%s: Incorrect mode specification: %s\n", argv[0], argv[1]);
    return 1;
  }

  // Open the message queue and prepare the variable for the message
  key_t qkey;
  int qid;
  if (mode != PRLL_CREATE_MODE) {
    if (argc < 3) {
      fprintf(stderr, "%s: Not enough parameters.\n", argv[0]);
      return 1;
    }
    qkey = strtoumax(argv[2], 0, 0);
    qid = msgget(qkey, 0);
    if (qid == -1 || qkey == 0) {
      if (mode != PRLL_TEST_MODE && mode != PRLL_REMOVE_MODE) {
	fprintf(stderr, "%s: Couldn't open the message queue.\n", argv[0]);
	perror(argv[0]);
      }
      return 1;
    } else if (mode == PRLL_TEST_MODE)
      return 0;
  }
  struct { long msgtype; char jarg; } msg;
  const long msgtype = 'm'+'a'+'p'+'p'; // arbitrary

  // Do the work
  // CLIENT (SEND A SINGLE MESSAGE) MODE
  if (mode == PRLL_CLIENT_MODE) {
    if (argc < 4) {
      fprintf(stderr, "%s: Not enough parameters.\n", argv[0]);
      return 1;
    }
    msg.msgtype = msgtype;
    msg.jarg = strtol(argv[3], 0, 0);
    if (errno) abrterr();
    if (msgsnd(qid, &msg, sizeof(msg.jarg), 0)) abrterr();
  // GET A SINGLE MESSAGE MODE
  } else if (mode == PRLL_GETONE_MODE) {
    if (msgrcv(qid, &msg, sizeof(msg.jarg), msgtype, 0) != sizeof(msg.jarg)) {
      perror(argv[0]);
    }
    if (msg.jarg == 0) {
      return 0;
    } else if (msg.jarg == 1) {
      return 1;
    } else abrterr2("Unknown command.");
  // CREATE A NEW QUEUE MODE
  } else if (mode == PRLL_CREATE_MODE) {
    do {
      if (mkrandom(&qkey)) abrterr2("Error accessing /dev/(u)random.");
    } while (-1 == (qid = msgget(qkey, 0600 | IPC_CREAT | IPC_EXCL))
	     && errno == EEXIST);
    if (qid == -1) abrterr();
    printf("%#" PRIXMAX "\n", (uintmax_t)qkey);
  // REMOVE MODE
  } else if (mode == PRLL_REMOVE_MODE) {
    if (msgctl(qid, IPC_RMID, NULL)) abrterr();
  }    
  return 0;
}