wollte fragen, ob man als tutor (da mitarbeiter der tu wien) campussoftware beziehen kann (nach entsprechender registrierung)?
Das interessiert mich auch. Hast Du in der Zwischenzeit was neues herausgefunden?
wollte fragen, ob man als tutor (da mitarbeiter der tu wien) campussoftware beziehen kann (nach entsprechender registrierung)?
Das interessiert mich auch. Hast Du in der Zwischenzeit was neues herausgefunden?
Hi,
ist es noch aktuell?
Danke es hat sich schon erledigt.
Was ist da zum Lachen? Es ist doch ein Biermischgetränk.:sudern:
Wo in Wien kann man dieses Bier (Becks green lemon) kaufen? Im Billa hab ich nur klassisches Becks gefunden.
Hallo, ich versuche 2 Kindprozesse von dem urspünglichen Prozess zu erzeugen die folgende Funktionalität haben:
Der Vater liest zeichenweise von stdin und schreibt die eingelesene Zeichen in der ersten Pipe. Das erste Kind liest von dieser Pipe die Zeichen aus und gibt diese weiter an die zweite Pipe. Das zweite Kind liest diese Zeichen von der zeiten Pipe und gibt diese auf stdout aus.
Ich bin nicht sicher ob ich das zweite fork() an der richtigen Stelle habe, bzw. das zweite wait().
Kompilierbar ist es problemlos aber nach der ausführung werden die zeichen nur gelesen aber nichts wird ausgegeben. Den Programm kann man auch nicht mit strg+D terminieren.
Hat jemand eine Idee was ich da falsch mache?
Source:
/* Program: mygzip
* Author: Filip Hianik 0426173
* Date: 27.05.2007
* Purpose: Der Programm liest von stdin Files die mit gzip zu komprimieren sind und komprimiert diese in einem File (falls dessen Name als Argument übergeben wird) oder in stdout.
* Usage: mygzip [file]
* Beispiel: 3b_mygzip
*/
/*
* ******************************************************************************************* defines ****
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
/*
* ******************************************************************************************** globals ***
*/
const char *szCommand = "<not yet set>"; /* command name */
static int pPipe[2];
static int pPipe2[2];
static pid_t pid, pid2;
static FILE *pStream = (FILE *) 0;
static FILE *pStream2 = (FILE *) 0;
FILE *fdopen (int filedes, const char *mode);
/*
* ***************************************************************************************** prototypes ***
*/
void BailOut (const char *szMessage); /* forward declaration */
/*
* ****************************************************************************************** functions ***
*/
void PrintError (const char *szMessage)
{
if (errno != 0)
{
(void) fprintf (stderr, "%s: %s - %s\n", szCommand, szMessage, strerror (errno));
}
else
{
(void) fprintf (stderr, "%s: %s\n", szCommand, szMessage);
}
}
void FreeResources (void)
{
if (pStream != (FILE *) 0)
{
if (fclose ((FILE *) pStream) == EOF)
{
pStream = (FILE *) 0;
BailOut ("Can not close pipe stream!");
}
pStream = (FILE *) 0; /* pipe no longer open */
}
if (pStream2 != (FILE *) 0)
{
if (fclose ((FILE *) pStream2) == EOF)
{
pStream2 = (FILE *) 0;
BailOut ("Can not close pipe stream 2");
}
pStream2 = (FILE *) 0;
}
}
void BailOut (const char *szMessage)
{
if (szMessage != (const char *) 0) /* print error message? */
{
PrintError (szMessage);
}
FreeResources ();
exit (EXIT_FAILURE);
}
void AllocateResources (void)
{
if (pipe (pPipe) == -1)
{
BailOut ("Can not create pipe!");
}
if (pipe (pPipe2) == -1)
{
BailOut ("Can not create pipe 2!");
}
}
void Usage (void)
{
(void) fprintf (stderr, "USAGE: %s [file]\n", szCommand);
BailOut ((const char *) 0);
}
void FatherProcess (void)
{
int c;
if (close (pPipe[0]) == -1)
{
BailOut ("Error closing the read descriptor!");
}
if ((pStream = fdopen (pPipe[1], "w")) == (FILE *) NULL)
{
BailOut ("Can not open pipe for writing");
}
while ((c = fgetc (stdin)) != EOF)
{
fputc (c, pStream);
}
FreeResources ();
}
void ChildProcess (void)
{
int c;
if (close (pPipe[1]) == -1)
{
BailOut ("Error closing the write descriptor!");
}
if ((pStream = fdopen (pPipe[0], "r")) == (FILE *) NULL)
{
BailOut ("Can not open pipe for reading!");
}
if (close (pPipe2[0]) == -1)
{
BailOut ("Error closing the write descriptor 2!");
}
if ((pStream2 = fdopen (pPipe2[1], "w")) == (FILE *) NULL)
{
BailOut ("Can not open pipe2 for writing!");
}
while ((c = fgetc (pStream)) != EOF)
{
fputc (c, pStream2);
}
if (ferror (pStream))
{
BailOut ("Can not read from pipe!");
}
FreeResources ();
}
void ChildProcess2 (void)
{
int c;
if (close (pPipe2[1]) == -1)
{
BailOut ("Error closing the write descriptor!");
}
if ((pStream2 = fdopen (pPipe2[0], "r")) == (FILE *) NULL)
{
BailOut ("Can not open pipe2 for reading!");
}
while ((c = fgetc (pStream2)) != EOF)
{
fputc (c, stdout);
}
if (ferror (pStream2))
{
BailOut ("Can not read from pipe2!");
}
FreeResources ();
}
int main (int argc, char **argv)
{
pid_t wpid, wpid2;
int status, status2;
szCommand = argv[0];
if (argc > 2)
{
Usage();
}
AllocateResources ();
switch (pid = fork ())
{
case -1:
BailOut ("Fork failed!");
break;
case 0:
ChildProcess ();
break;
default:
switch (pid2 = fork ())
{
case -1:
BailOut ("Fork2 failed!");
break;
case 0:
ChildProcess2 ();
break;
default:
FatherProcess ();
break;
}
while ((wpid = wait (&status)) != pid)
{
if (wpid != -1)
{
continue;
}
if (errno == EINTR)
{
continue;
}
BailOut ("Error waiting for child process 1!");
}
while ((wpid2 = wait (&status2)) != pid2)
{
if (wpid2 != -1)
{
continue;
}
if (errno == EINTR)
{
continue;
}
BailOut ("Error waiting for child process 2!");
}
break;
}
exit (EXIT_SUCCESS);
}
Alles anzeigen
danke für jede Hilfe.
mfg NonSense
Habs geloest mit der Reihenfolge, zuerst Initialisierungen und erst dann Zuweisungen.
ich würd mal sagen ohne -ansi kompilieren.
Ohne -ansi ist es bissl Problem weil die Richtlinien für Sysprog sind leider fest vorgegeben:
Ich glaube Dein Problem ist, dass Du vergisst '\0' am Ende von invertline zu setzen. Dadurch gibt er immer den ganzen puffer aus.
Versuche einmal, ob invertline[x+1] = '\0' vor der for-Schleife das Problem löst.
Toll, es hat geklappt
Danke:thumb:
Hmm eigentlich hat es mir nicht sehr geholfen.
Ich versuche einen invertstr program zu machen, es liest zeilenweise aus dem stdin, invertiert die Zeile und gibt wieder aus.
Wenn ich das invertline[0] = '\0' benutze dann ist das invertline für immer leer.
Hier der Source:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 50
int main (int argc, char **argv)
{
char line[MAX_LENGTH+1];
char invertline[MAX_LENGTH];
int x, i;
while (fgets (line, sizeof (line), stdin) != NULL)
{
x = (strlen (line) - 1);
for (i = 0; i < (strlen (line) -1); i++)
{
invertline[x--] = line[i];
}
printf ("line size: %i\n", strlen (invertline));
printf ("inverted line: %s\n", invertline);
invertline[0] = '\0';
}
return 0;
}
Alles anzeigen
Wie mache ich in C ein char array wieder leer?
Hab in char line[MAX_LENGTH] was eingelesen und brauche es wieder zu leeren.
Hat jemand Ahnung, wo man solche Sachen kaufen konnte?
Wie mache ich aus einem float ein string?
Könnte jemand helfen? Danke.
Hi, ich hab das Win XP mit der TU Lizenz im LMZ gekauft und besitze 2 PC´s (Standpc und Laptop). Kann ich das Win auf beide installieren oder nur auf einen?
Na ja, danke. Aber mir interessiert wie man es selbst ausprogramieren kann. Ohne das eingebaute Prädikat zu nutzen. Hab es mit diesem delete versucht aber eine Sache gefällt mir nicht. Wenn ich z.B. eine Liste [a,b,b,c] habe und möchte das Element b löschen. Kann man das irgendwie machen, dass nur das erste b gelöscht wird und nicht jede b?
Kann mir jemand helfen einen 3-stelligen Prädikat loesche/3 zu schreiben, der ein Element aus einer Liste löscht?
Es sollte so funktionieren:
loesche(b,[a,b,c,d],X).
X=[a,c,d]
thx
Meins sieht so aus.