Ausgabe immer auf TTY

Dennis Wronka

Soulcollector
Hi, seit langem mal wieder ein C-Problem meinerseits.
Fuer meine LiveCD baue ich auch die SquashFS-Tools, welche aber in Standardausfuehrung den Progressbalken auf STDOUT schreiben.
Da die Linux-Live-Scripts aber die Ausgabe in /dev/null umlenken sehe ich nichts vom Fortschritt.
Die SquashFS-Tools die bei den Live-Scripts dabei sind kommen damit klar, der groesste Teil der Ausgabe laeuft nach /dev/null, der Progressbalken aber wird angezeigt.

Beide Male ueber den Aufruf
Bash:
mksquashfs /bin /bin.mo > /dev/null
Ich hab das C-File nun schon umgeschrieben, dass auf STDERR ausgegeben wird, und auch direkt auf /dev/tty.
Ersteres hatte zwar eine Ausgabe zur Folge, aber nicht die erwuenschte. Zweiteres wurde auch nach /dev/null umgeleitet wenn ich das recht gesehen hab.
Ich gehe also davon aus, dass STDERR der richtige Weg ist, jedoch wird dort ziemlicher Kaese ausgegeben, und zwar der Progressbalken immer wieder hintereinander, obwohl, wenn ich das recht im Code sehe, ein CR stattfinden sollte.

Ich werd auf jeden Fall mal weiterschauen, fuer Tipps waere ich aber dankbar.


Nachtrag: Es muss ueber STDERR laufen, denn der Aufruf
Bash:
mksquashfs /bin /bin.mo 2> /dev/null
brachte nur die anderen Ausgaben, aber nicht den Progressbalken.

Nachtrag 2:
Hier die Funktion im Original:
C:
int progress_bar(long long current, long long max, int columns)
{
        int max_digits = ceil(log10(max));
        int used = max_digits * 2 + 10;
        int hashes = (current * (columns - used)) / max;
        int spaces = columns - used - hashes;

        if(!progress || columns - used < 0)
                return;

        printf("\r[");

        while (hashes --)
                putchar('=');

        while(spaces --)
                putchar(' ');

        printf("] %*lld/%*lld", max_digits, current, max_digits, max);
        printf(" %3lld%%", current * 100 / max);
        fflush(stdout);
}
Hier meine angepasste Fassung
C:
int progress_bar(long long current, long long max, int columns)
{
        int max_digits = ceil(log10(max));
        int used = max_digits * 2 + 10;
        int hashes = (current * (columns - used)) / max;
        int spaces = columns - used - hashes;

        if(!progress || columns - used < 0)
                return;

        printf(stderr,"\r[");

        while (hashes --)
                fputc('=',stderr);

        while(spaces --)
                fputc(' ',stderr);

        printf(stderr,"] %*lld/%*lld", max_digits, current, max_digits, max);
        printf(stderr," %3lld%%", current * 100 / max);
        //fflush(stdout);
}
und die etwas missgestaltete Ausgabe dieser
= = = = == == == == === === === === === ==== ==== ==== ==== ===== ===== ===== ===== ====== ====== ====== ====== ====== ======= ======= ======= ======= ======== ======== ======== ======== ========= ========= ========= ========= ========== ========== ========== ========== ========== =========== =========== =========== =========== ============ ============ ============ ============ ============= ============= ============= ============= ============= ============== ============== ============== ============== =============== =============== =============== =============== ================ ================ ================ ================ ================ ================= ================= ================= ================= ================== ================== ================== ================== =================== =================== =================== =================== ==================== ==================== ==================== ==================== ==================== ===================== ===================== ===================== ===================== ====================== ====================== ====================== ====================== ======================= ======================= ======================= ======================= ======================= ======================== ======================== ======================== ======================== ========================= ========================= ========================= ========================= ========================== ========================== ========================== ========================== ========================== =========================== =========================== =========================== =========================== ============================ ============================ ============================ ============================ ============================= ============================= ============================= ============================= ============================== ============================== ============================== ============================== ============================== =============================== =============================== =============================== =============================== ================================ ================================ ================================ ================================ ================================= ================================= ================================= ================================= ================================= ================================== ================================== ================================== ================================== =================================== =================================== =================================== =================================== ==================================== ==================================== ==================================== ==================================== ===================================== ===================================== ===================================== ===================================== ===================================== ====================================== ====================================== ====================================== ====================================== ======================================= ======================================= ======================================= ======================================= ======================================== ======================================== ======================================== ======================================== ======================================== ========================================= ========================================= ========================================= ========================================= ========================================== ========================================== ========================================== ========================================== =========================================== =========================================== =========================================== =========================================== =========================================== ============================================ ============================================ ============================================ ============================================ ============================================= ============================================= ============================================= ============================================= ============================================== ============================================== ============================================== ============================================== =============================================== =============================================== =============================================== =============================================== =============================================== ================================================ ================================================ ================================================ ================================================ ================================================= ================================================= ================================================= ================================================= ================================================== ================================================== ================================================== ================================================== ================================================== =================================================== =================================================== =================================================== =================================================== ==================================================== ==================================================== ==================================================== ==================================================== ===================================================== ===================================================== ===================================================== ===================================================== ===================================================== ====================================================== ====================================================== ====================================================== ====================================================== ======================================================= ======================================================= ======================================================= ======================================================= ======================================================== ======================================================== ======================================================== ======================================================== ========================================================= ========================================================= ========================================================= ========================================================= ========================================================= ========================================================== ========================================================== ========================================================== ========================================================== =========================================================== =========================================================== =========================================================== =========================================================== ============================================================ ============================================================ ============================================================ ============================================================ ============================================================ ============================================================= ============================================================= ============================================================= ============================================================= ============================================================== ============================================================== ============================================================== ============================================================== =============================================================== =============================================================== =============================================================== =============================================================== ================================================================
Mir scheint fast als muesste ich noch eine Funktion anpassen, denn hier scheinen ja auch die Prozentzahlen zu fehlen.
 
So, durch weitere Suche in den man-Pages und etwas Probierei bin ich nun auf die Loesung gekommen, fprintf().
Hier die funktionierende Fassung der Funktion:
C:
int progress_bar(long long current, long long max, int columns)
{
        int max_digits = ceil(log10(max));
        int used = max_digits * 2 + 10;
        int hashes = (current * (columns - used)) / max;
        int spaces = columns - used - hashes;

        if(!progress || columns - used < 0)
                return;

        fprintf(stderr,"\r[");

        while (hashes --)
                fputc('=',stderr);

        while(spaces --)
                fputc(' ',stderr);

        fprintf(stderr,"] %*lld/%*lld", max_digits, current, max_digits, max);
        fprintf(stderr," %3lld%%", current * 100 / max);
}
 
Zurück