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); }
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; }