2017-11-15 2 views
-4

Ich sah die folgende Codezeile here.Was macht "~ []"?

puts("sigprocmask(SIG_UNBLOCK, ~[], []) = 0"); 

Ich verstehe nicht, was nicht leeres Array-Skript ([]) tun?

Auch, was ist der Zweck von ~[] in C?

+3

Es ist in einem String-Literal. Es tut nichts in C. – StoryTeller

+1

@rsp, falsch, nicht "Es tut nichts", aber "Es tut nichts ** in C **" –

+1

Ich denke, die Frage ist nicht schlecht . Warum so viele Downvotes? – Jayesh

Antwort

3

Das verknüpfte Programm scheint seine Aktionen in einer erfundenen semi-formalisierten Sprache zu protokollieren. Diese Protokollierungssprache ist nicht C. Das Zeichenfolgenliteral in Ihrer Frage ist nur eine Zeile in dieser erfundenen "Sprache", die das Programm an die Standardausgabe sendet. Daher hat das ~[]-Bit nichts mit C zu tun und hat keine spezielle Bedeutung in C-Kontext.

Nach jedem (angeblich erfolgreich) k_sigprocmask Aufruf der Progrtam-Protokolle, die durch Senden solcher Zeichenfolgen an den Ausgang aufrufen.

Wenn beispielsweise die Programmausgängen sigprocmask(SIG_SETMASK, [], NULL) = <something> es im Grunde sagt nur der Benutzer „ich gerade k_sigprocmask Funktion mit ersten Argument SIG_SETMASK, leeren Satz von Bits als das zweite Argument, und einen Null-Zeiger als drittes Argument bezeichnet. Und I erhielt <something> als der Fehlercode. "

[] steht für Bitmaske für alle Bits-Null (leerer Satz). [HUP INT QUIT] steht für eine Maske mit nur HUP, INT und QUIT Bits auf 1 gesetzt ~[HUP] steht für eine Maske mit allen zu 1 mit der Ausnahme HUP Bit gesetzt Bits.

~[] steht für einen seltsamen Argumentwert new_set - 1, der für mich nicht sofort Sinn ergibt (da new_set ein Zeiger ist). Ich nehme an, dass es irgendwie zu einem Set mit allen Elementen kommt (alle Bits sind auf 1 gesetzt).

3

Es tut nichts.

puts("sigprocmask(SIG_UNBLOCK, ~[], []) = 0"); 
    ^         ^

Es ist ein String-Literal. Diese Zeile wird wahrscheinlich verwendet, um ein Programm in einer anderen Sprache zu erzeugen, die zumindest nicht C.

0

Die Syntax ~ [] ist Teil von Javascript bitweise NICHT leer Array-Ausdruck. C hat keinen solchen Operator.

+0

Öffnen Sie den GitHub-Link und sehen Sie die Erweiterung des Dateinamens. – rsp

+1

@rsp - Die Datei könnte vor oder nachbearbeitet werden. Google verwendet eine Web-Technologie, um die Verarbeitung durchzuführen, klingt für mich plausibel. Oder vielleicht ist es wie jemand anders kommentiert, dass es ein von AOSP erfundenes Gerät ist. Das ist zumindest meine Vermutung. – jww

1

Die reference Says:

Auf der anderen Seite, Bit-Sets sind auch eckige Klammern aber Satz Elemente getrennt sind durch einen Raum nur gezeigt werden. Hier ist die Schale Herstellung eines externen Befehl auszuführen:

sigprocmask(SIG_BLOCK, [CHLD TTOU], []) = 0 

hier Das zweite Argument ist ein Bit-Satz von zwei Signalen, und SIGCHLD SIGTTOU. In einigen Fällen ist das Bit-Set so voll, dass das Drucken der nicht gesetzten Elemente wertvoller ist.In diesem Fall wird der Bit-Satz durch eine Tilde wie dies voran:

sigprocmask(SIG_UNBLOCK, ~[], NULL) = 0 

Hier ist das zweite Argument stellt den vollständigen Satz aller Signale.