Domanda

Può un processo "foo" scrivere su file descrittore 3, ad esempio, in modo tale che all'interno di una shell bash si possa fare

foo 1>f1 2>f2 3>f3

E in tal caso come lo scriveresti (in c)?

È stato utile?

Soluzione

La shell apre i descrittori di file per il programma prima di eseguirlo. Usali semplicemente come faresti con qualsiasi altro descrittore di file, ad esempio write(3, buf, len); ecc. Potresti voler eseguire il controllo degli errori per assicurarti che fossero effettivamente aperti (tentando di farlo dup loro quindi chiudere il duplicato sarebbe un facile controllo).

Altri suggerimenti

Puoi iniziare il tuo comando con:

./foo 2>/dev/null 3>file1 4>file2 

Quindi se LS -l/proc/_pid_of_foo_/fd vedrai che i descrittori di file vengono creati e puoi scriverli tramite EG.:

write(3,"abc\n",4);

Sarebbe meno hacky forse se controllassi prima il descrittore di file (con FCNTL?).

No.

I descrittori di file sono aperti dalla shell e il processo figlio li eredita. Non è il processo figlio che apre questi descrittori di file accessibili a riga di comando, è il processo di bash.

potrebbe Sii un modo per convincere Bash ad aprire ulteriori descrittori di file per conto del processo. Non sarebbe portabile ad altre conchiglie e non sono sicuro che esista un meccanismo - sto solo speculare.

Il punto è che non puoi farlo dalla codifica del processo del bambino in modo speciale. Il guscio dovrebbe rispettare i tuoi desideri.

Può un processo "foo" scrivere su file descrittore 3, ad esempio, in modo tale che all'interno di una shell bash si possa fare [...] e in tal caso come lo scriveresti (in c)?

Non sono sicuro di quello che sei proprio dopo, ma qualunque cosa sia, il punto di partenza sarà il man dup/man dup2 - Ecco come le shell fanno di un descrittore di file casuali un descrittore di file con un determinato numero.

Ma ovviamente, il processo foo Deve sapere in qualche modo che possa scrivere al descrittore di file 3. POSIX specifica solo 0, 1 e 2: Shell assicura che tutto ciò che viene avviato ottenga i descrittori di file e il LIBC nel contesto dell'applicazione si aspetta anche che siano STDIN/STDOUT/STDERR. A partire da 3 e oltre - dipende dallo sviluppatore di applicazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top