17 votes

Comment puis-je faire en sorte que l'appel système write() s'imprime à l'écran ?

Pour mon cours sur les systèmes d'exploitation, je suis censé implémenter le chat de Linux en utilisant uniquement les appels système (pas de printf).

Lecture cette référence J'ai constaté qu'il était utilisé pour imprimer dans un fichier. Je suppose que je devrais manipuler ofstream.

Dans l'exemple ci-contre : ofstream outfile ("new.txt",ofstream::binary);

Comment puis-je faire en sorte qu'il s'inscrive à l'écran ?

EDIT : Je me suis rendu compte que write() fait partie de la bibliothèque iostream, est-ce la même chose que l'appel système int write (int fd, char *buf , int size) ?

27voto

jschmier Points 8088

Un appel système est un service fourni par le noyau Linux. En programmation C, des fonctions sont définies dans libc et fournissent une enveloppe pour de nombreux appels système. L'appel de fonction write() est l'un de ces appels système.

Le premier argument transmis à write() est le descripteur de fichier sur lequel écrire. Les constantes symboliques STDERR_FILENO , STDIN_FILENO y STDOUT_FILENO sont respectivement définis comme 2 , 0 y 1 en unidtd.h . Vous voulez écrire dans l'un ou l'autre STDOUT_FILENO o STDERR_FILENO .

const char msg[] = "Hello World!";
write(STDOUT_FILENO, msg, sizeof(msg)-1);

Vous pouvez également utiliser l'option syscall() pour effectuer un appel système indirect en spécifiant le numéro de fonction défini dans la section syscall.h o unistd.h . En utilisant cette méthode, vous pouvez garantir que vous n'utilisez que des appels système. Il se peut que vous trouviez L'appel système Linux Réflexion rapide (lien PDF) peut être utile.

/* 4 is the system call number for write() */
const char msg[] = "Hello World!";
syscall(4, STDOUT_FILENO, msg, sizeof(msg)-1);

9voto

Jerry Coffin Points 237758

Non, std::ostream::write n'est pas la même que la write appel système. Il fait (presque certainement) utiliser les write du moins sur un système comme Linux qui dispose d'une telle chose, et il fait normalement des choses assez similaires, mais il s'agit toujours d'une chose distincte qui lui est propre.

Cependant, Linux ouvrira au préalable des flux d'entrée standard, de sortie standard et d'erreur standard pour votre processus. Pour écrire à l'écran, vous devez normalement utiliser write (c'est-à-dire celle qui est un appel système) pour écrire dans le flux numéro 1 ou le numéro du flux 2 (qui sont respectivement la sortie standard et l'erreur standard).

Si vous devez écrire sur l'écran, même si celui-ci est redirigé, vous devez normalement ouvrir un flux vers /dev/tty et (à nouveau) utiliser write pour lui écrire :

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() { 
    char msg[] = "hello\n";

    int fd = open("/dev/tty", O_WRONLY);
    write(fd, msg, sizeof(msg));
    return 0;
}

4voto

Nikolai N Fetissov Points 52093
#include <unistd.h>
/* ... */
const char msg[] = "Hello world";
write( STDOUT_FILENO, msg, sizeof( msg ) - 1 );

Le premier argument est le descripteur de fichier pour STDOUT (généralement 1 ), le deuxième est le tampon à partir duquel écrire, le troisième est la taille du texte dans le tampon ( -1 est de ne pas imprimer le terminateur zéro).

3voto

Renold Wasnik Points 41
#define _GNU_SOURCE         /* See feature_test_macros(7) */    
#include <unistd.h> // For open, close, read, write, fsync
#include <sys/syscall.h>  //For SYSCALL id __NR_xxx

//Method 1 : API    
write(1,"Writing via API\n",\
        strlen("Writing via API\n") ); 
fsync(1);
//Method 2  : Via syscall id
const char msg[] = "Hello World! via Syscall\n";
syscall(__NR_write, STDOUT_FILENO, msg, sizeof(msg)-1);     
syscall(__NR_fsync, STDOUT_FILENO );    // fsync(STDOUT_FILENO);

-3voto

R.. Points 93718

Votre référence est incorrecte. Elle fait partie de C++ et n'a rien à voir avec votre devoir. La référence correcte est http://www.opengroup.org/onlinepubs/9699919799/functions/write.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X