Co zamiast kodów ASCII? Zadanie z funkcją fork()

0

Cześć!
Mam takie zadanie:

Zadanie 2. Procesy - użycie funkcji fork()
Napisz program, który tworzy jeden proces potomny. Proces potomny wyświetla n razy zestaw małych liter alfabetu
(czyli litery od a do z), proces macierzysty wyświetla n razy zestaw wielkich liter alfabetu (czyli litery od A do Z.
Wartość n jest podawana w wierszu wywołania programu. Sprawdź, czy każde wykonanie programu będzie
przebiegało tak samo? Spróbuj uruchomić program na różnych komputerach. Wybierz duże n.
Uwaga: Nie wolno wykorzystywać liczbowych kodów ASCII!

I mam do Was pytanie - moje rozwiązanie jest poprawne? Czy spełniam wszystkie warunki tego zadania?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    int n, i, c;
    pid_t pid;

    if (argc != 2) {
        fprintf(stderr, "Usage %s <n>\n", argv[0]);
        return (EXIT_FAILURE);
    } else {
        n = atoi(argv[1]);

        if (n <= 0) {
            fprintf(stderr, "n musi byc wieksze od 0\n");
            return (EXIT_FAILURE);
        }
    }

    pid = fork();

    switch (pid) {
        case -1:
            fprintf(stderr, "Blad przy fork()");
            break;
        case 0:
            for (i = 0; i < n; i++) {
                for (c = 'a'; c <= 'z'; c++) {
                    printf("%c", c);
                }
                
                printf("\n");
            }
            
            break;

        default:
            for (i = 0; i < n; i++) {
                for (c = 'A'; c <= 'Z'; c++) {
                    printf("%c", c);
                }
                
                printf("\n");
            }
            
            break;
    }

    return (EXIT_SUCCESS);
} 
0

Tak, chodzi o użycie stałych znakowych, ponieważ w teorii standard C/C++ nie wymaga aby używano ASCII. W rzeczywistości to się teraz praktycznie nie zdarza.

Obserwacją ma pewnie być synchronizacja (lub jej brak) wyjścia standardowego pomiędzy dwoma procesami, dlatego masz sprawdzić na możliwie dużej ilości komputerów i systemów.

1

W rzeczywistości to się teraz praktycznie nie zdarza.

z/OS z tym swoim EBCDIC jeszcze nie umarł ;). Ostatnio programiści mainframe'owi podnieśli wrzawę, że z C++17 zostaną usunięte trigraphy. A w tym roku nawet widziałem kod, w którym zamiast jednej pętli od A do Z były trzy: od A do I, od J do R i od S do Z - właśnie po to, żeby kod działał zarówno na ASCII jak i EBCDIC.

2

Tak na pierwszy rzut oka... rozumiem że systemy zgodne z POSIX...

  1. Włączył bym <unistd.h> gdzie jest fork()
  2. Przy błędzie fork() użył bym raportowania z errno (najprościej strerror()) a więc włączyć <errno.h> i ew. <string.h> (jeśli będzie strerror())
  3. Po każdym wywołaniu printf() w wątku, użyj fflush(stdout). Inaczej możesz nie udowodnić szybko intencji zlecającego z "przetasowaniem" znaków ASCII.
  4. Pewnie po poprawkach wyjdzie Ci że bloki kodu wyświetlające znaki warto wydzielić do funkcji.
  5. Koledzy mają rację co do znaków liter. Niemniej jednak jeśli to miało by spowodować odrzucenie zadania, sam bym to określał jako "nieżyczliwą złośliwość" :-) Tu zrobisz jak chcesz. Osobiście dodał bym ładny komentarz z zagadnieniem EBCDIC w kodzie i po sprawie. Pewnie już byś tym "zapunktował" :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1