2008-12-04 21 views
131

Ich portiere ein relativ einfaches Konsolenprogramm für Unix auf die Windows-Plattform (Visual C++ 8.0) portiert. Alle Quelldateien enthalten "unistd.h", das nicht existiert. Wenn ich es entferne, bekomme ich Beschwerden darüber, dass ich Prototypen für 'srandom', 'random' und 'getopt' vermisse. Ich weiß, ich kann die zufälligen Funktionen ersetzen, und ich bin mir ziemlich sicher, dass ich eine getopt-Implementierung finden/hacken kann.Gibt es einen Ersatz für unistd.h für Windows (Visual C)?

Aber ich bin sicher, andere haben die gleiche Herausforderung erlebt. Meine Frage ist: Gibt es einen Port von "unistd.h" zu Windows? Mindestens eines mit solchen Funktionen, die eine native Windows-Implementierung haben - ich brauche keine Pipes oder Forking.

EDIT:

Ich weiß, dass ich meine eigene „unistd.h“ zu schaffen, die als Ersatz für das, was ich brauche enthält - besonders in diesem Fall, da es sich um eine begrenzte Menge ist. Aber da es sich um ein allgemeines Problem handelt, habe ich mich gefragt, ob jemand die Arbeit bereits für eine größere Teilmenge der Funktionalität erledigt hat.

Wechseln zu einem anderen Compiler oder einer anderen Umgebung ist bei der Arbeit nicht möglich - ich bin mit Visual Studio festgefahren.

Antwort

134

Da wir keine Version im Internet finden können, lassen Sie uns hier eine starten.
Die meisten Ports zu Windows benötigen wahrscheinlich nur eine Teilmenge der vollständigen Unix-Datei.
Hier ist ein Ausgangspunkt. Bitte fügen Sie Definitionen nach Bedarf hinzu.

#ifndef _UNISTD_H 
#define _UNISTD_H 1 

/* This is intended as a drop-in replacement for unistd.h on Windows. 
* Please add functionality as neeeded. 
* https://stackoverflow.com/a/826027/1202830 
*/ 

#include <stdlib.h> 
#include <io.h> 
#include <getopt.h> /* getopt at: https://gist.github.com/ashelly/7776712 */ 
#include <process.h> /* for getpid() and the exec..() family */ 
#include <direct.h> /* for _getcwd() and _chdir() */ 

#define srandom srand 
#define random rand 

/* Values for the second argument to access. 
    These may be OR'd together. */ 
#define R_OK 4  /* Test for read permission. */ 
#define W_OK 2  /* Test for write permission. */ 
//#define X_OK 1  /* execute permission - unsupported in windows*/ 
#define F_OK 0  /* Test for existence. */ 

#define access _access 
#define dup2 _dup2 
#define execve _execve 
#define ftruncate _chsize 
#define unlink _unlink 
#define fileno _fileno 
#define getcwd _getcwd 
#define chdir _chdir 
#define isatty _isatty 
#define lseek _lseek 
/* read, write, and close are NOT being #defined here, because while there are file handle specific versions for Windows, they probably don't work for sockets. You need to look at your app and consider whether to call e.g. closesocket(). */ 

#ifdef _WIN64 
#define ssize_t __int64 
#else 
#define ssize_t long 
#endif 

#define STDIN_FILENO 0 
#define STDOUT_FILENO 1 
#define STDERR_FILENO 2 
/* should be in some equivalent to <sys/types.h> */ 
typedef __int8   int8_t; 
typedef __int16   int16_t; 
typedef __int32   int32_t; 
typedef __int64   int64_t; 
typedef unsigned __int8 uint8_t; 
typedef unsigned __int16 uint16_t; 
typedef unsigned __int32 uint32_t; 
typedef unsigned __int64 uint64_t; 

#endif /* unistd.h */ 
+17

Ein vollständiger GNU-getopt-Port befindet sich hier: http://www.codeproject.com/KB/cpp/getopt4win.aspx – Annie

+0

'ssize_t'? Soll das nicht "size_t" sein? –

+2

nein, 'ssize_t' ist korrekt: http://www.delorie.com/gnu/docs/glibc/libc_239.html – AShelly

20

Ich würde empfehlen, mingw/msys als Entwicklungsumgebung zu verwenden. Vor allem, wenn Sie einfache Konsolenprogramme portieren. Msys implementiert eine Unix-ähnliche Shell unter Windows, und Mingw ist ein Port des GNU compiler collection (GCC) und anderer GNU-Build-Tools für die Windows-Plattform. Es ist ein Open-Source-Projekt und für die Aufgabe gut geeignet. Ich benutze es derzeit, um Hilfsprogramme und Konsolen-Anwendungen für Windows XP zu erstellen, und es hat sicherlich die unistd.h Header, die Sie suchen.

Die Installationsprozedur kann ein wenig schwierig sein, aber ich fand, dass der beste Ort zum Starten ist in MSYS.

+1

und in diesen Tagen MSYS2 –

-1

Erstellen Sie Ihren eigenen Header unistd.h und fügen Sie die benötigten Header für Funktionsprototypen hinzu.

+6

Ich weiß, dass ich tun kann, werde ich die Frage bearbeiten, um das klarer zu machen. Der Punkt der Frage war: Hat jemand anderes es für mich getan? – AShelly

5

Nein, IIRC gibt es keine getopt() unter Windows.

Boost hat jedoch die program_options Bibliothek ... die funktioniert in Ordnung. Es wird zunächst als Overkill erscheinen, aber es ist nicht schrecklich, vor allem wenn man bedenkt, dass es neben den Befehlszeilenoptionen Programmoptionen in Konfigurationsdateien und Umgebungsvariablen verarbeiten kann.

+0

lustiges googeln für "getopt windows" geben Sie dies als der erste Treffer: http://www.codeproject.com/KB/cpp/xgetopt.aspx –

+0

Der Punkt war nicht, den vorhandenen Code neu zu schreiben, um Boost oder einige zu verwenden anderer Parser. – AShelly

+0

@AShelly: Ich fürchte, wenn Sie mit * nix nur APIs codieren, dann haben Sie keine andere Wahl, als entweder bestehenden Code neu zu schreiben, um portabel zu sein, oder Ihre eigene Implementierung der fehlenden Funktionalität bereitzustellen. Wenn Sie boost :: program_options verwendet haben, funktioniert es auf vielen Plattformen ohne Änderungen. – paxos1977

89

Versuchen Sie, einschließlich der io.h Datei. Es scheint das Visual Studio-Äquivalent von unistd.h zu sein.

Ich hoffe, das hilft.

+0

Hat mir geholfen, danke :) – anhoppe

13

Ich stolperte über diesen Thread beim Versuch, eine Windows-Alternative für getpid() zu finden (definiert in unistd.h). Es stellt sich heraus, dass einschließlich process.h den Trick macht. Vielleicht hilft das Leuten, die diesen Thread in der Zukunft finden.

Verwandte Themen