Programmieraufgabe 2001

Signal blockieren

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Programmieraufgabe 2001
Hallo ihr,

ich sitze grad vor der Klaisuraufgabe 2001 und weiß nicht genau wie man dan SIGCHLD-Handler blockiert un deblockiert. Also ich wei, dass man was mit sigprocmask() machen muss. Aber wie genau? Kann mir da jemand helfen :finger: ?
Vielen Dank und allen noch viel Erfolg beim Lernen!

sigprocmask

int sigBlock(int sig) {
	sigset_t sigtempset;
	sigemptyset(&sigtempset);
	sigaddset(&sitempset, sig);
	return sigprocmask(SIG_BLOCK, &sigtempset, NULL);
}

bzw.

int sigUnBlock(int sig) {
	sigset_t sigtempset;
	sigemptyset(&sigtempset);
	sigaddset(&sitempset, sig);
	return sigprocmask(SIG_UNBLOCK, &sigtempset, NULL);
}

was das signal mit signalnummer sig blockiert bzw deblockiert!
uoeh


Thanx


@q: sauber!
das ist mal uebersichtlicher und vielseitiger c-code (auf welchen ich nie kommen wuerde :[).


undwas wenn sigemptyset/sigaddset nen fehler liefert??

abfagnen
dann haman an dreck im schachtal


bitte?
:wand:


die bringen keine fehler.
ich hab das zwar auch mal in irgendeiner aufgabe abgefragt, aber das ist totaler nonsense…


int i;
if ((i = 4) == -1)
{
    perror("Wert konnte der Variablen nicht zugewiesen werden");
    exit(1);
}

LOL!


Wie schaut bei euch da das Verbindung bearbeiten aus und wie macht man das mit dem EXIT-Status?

Stimmt das so ungefähr:?

[code]while{
read (fd, buffer,strlen(buffer);
if (!strcmp (buf, “exit”))…;
entry == readdir(buffer)
sprintf(“%s : %d\n”, buf , entry->d_size)
write(fd, res, strlen(res)…

[/code]

Hab jetzt mal die ganzen Fehlerabfragen weggelassen.

progr. aufg juli 2001
progr. aufg juli 2001:
hab noch probleme mit meinem code.kann mir jemand weiterhelfen bei der traverse_dir() function und run_command() zwar hier:

while (( entry = readdir (dir)) != NULL)
{
if(entry->d_name[0] == ‘.’) {
continue;
}

/* Aus jedem Verzeichniseintrag wird zusammen mit aktuellen Verzeichnisnamen ein kompletter path-Name gebildet. Path_namen, welche länger als MAX_PATH sind, werden überspungen */
*

  • code

/* Mit dem kompletten Path-namen ist der dateistatus abzufragen. handelt es sich bei dem Verzeichniseintrag um ein Verzeichnis so wird die funktion
TRAVERSE_DIR rekursiv aufgerufen, bei einer regulären Datei wird RUN_COMMAND aufgerufen, symbolische Links werden nicht verfolgt. */

was sind eigentlich bei run_command: arguments[0], arguments[1], arguments[2]


ja du bastelt dir danach den Pfadnamen zusammen(also mit strcat)
Nimmst also den Verzeichnisnamen,hängst mit strcat den “/” ran und danach mit strcat dein entry.d_name.
Jetzt musst du nnur noch mit if abfragen ob strlen von Pfadnamen> MAX_PATH.
Also so ungefähr:

[code]pathname = strcat (dir_name , “/”);
strcat (pathname, entry.d_name); /jetzt hast du den gesamten Pfadnamen/
if ((strlen (pathname))>MAX_PATH)
continue;

[/code]

Der Code müsste ungefähr so ausschauen.Aber nagelt mich nicht fest!


sorry, da stimmt so fast nix.

read gibt ja was zurück.
buf oder buffer?
buffer braucht noch ein ‚\0‘ bevor du damit string-ops drauf kannst

entry == readdir(buffer)? das ist ein vergleich und muss man nicht voher überprüfen ob es ein verzeichnis ist und das verzeichnis öffnen, um es auszulesen?

die größe bekommst du aus einem struct stat, nicht aus dem verzeichnis eintrag

jo


je nachdem welches exec du benutzt brauchst du andere argumente. execvp will als zweites argument ein array

arguments[0] der auszuführende befehl
arguments[1] ein parameter für den befehl, vielleicht ein dateiname?
arguments[2] NULL

siehe auch manpage execvp

jo


yeah - dum dum dududum dudududum dum dududum …


yeah - pustefunk


Mastergrunde - We’ll come running - 01 - Löwenzahn :wink:


seid ihr fertig?