2008-12-04 23 views
131

Przesyłam stosunkowo prosty program konsoli napisany dla Unixa na platformę Windows (Visual C++ 8.0). Wszystkie pliki źródłowe zawierają "unistd.h", który nie istnieje. Usuwając go, dostaję skargi na pomijanie prototypów "srandom", "random" i "getopt". Wiem, że mogę zastąpić losowe funkcje i jestem prawie pewien, że mogę znaleźć/włamać się do implementacji getopt.Czy istnieje zamiennik dla unistd.h dla systemu Windows (Visual C)?

Ale jestem pewien, że inni napotkali na to samo wyzwanie. Moje pytanie brzmi: czy istnieje port "unistd.h" do systemu Windows? Co najmniej jeden zawierający te funkcje, które mają natywną implementację systemu Windows - nie potrzebuję potoków ani rozwidleń.

EDIT:

wiem, że mogę stworzyć mój własny „unistd.h”, który zawiera zamienniki dla rzeczy potrzebne - zwłaszcza w tym przypadku, ponieważ jest ograniczony zestaw. Ale ponieważ wydaje się, że jest to powszechny problem, zastanawiałem się, czy ktoś wykonał już pracę dla większego podzbioru funkcjonalności.

Przełączanie do innego kompilatora lub środowiska nie jest możliwe w pracy - utknąłem w Visual Studio.

Odpowiedz

134

Ponieważ nie możemy znaleźć wersji w Internecie, zacznijmy ją tutaj.
Większość portów do systemu Windows prawdopodobnie potrzebuje tylko podzestawu kompletnego pliku uniksowego.
Oto punkt wyjścia. W razie potrzeby dodaj definicje.

#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

Pełny port getopt GNU znajduje się tutaj: http://www.codeproject.com/KB/cpp/getopt4win.aspx – Annie

+0

'ssize_t'? Czy to nie ma być "size_t"? –

+2

nie, 'ssize_t' jest poprawny: http://www.delorie.com/gnu/docs/glibc/libc_239.html – AShelly

20

Polecam używanie mingw/msys jako środowiska programistycznego. Zwłaszcza jeśli przenosisz proste programy konsolowe. Msys implementuje uniksopodobną powłokę w systemie Windows, a mingw jest portem GNU compiler collection (GCC) i innymi narzędziami do budowania GNU na platformę Windows. Jest to projekt typu open-source, dobrze dostosowany do zadania. Obecnie używam go do budowania programów narzędziowych i aplikacji konsolowych dla Windows XP, i na pewno ma ten nagłówek unistd.h, którego szukasz.

Procedura instalacji może być nieco skomplikowana, ale stwierdziłem, że najlepszym miejscem do rozpoczęcia jest MSYS.

+1

i te dni MSYS2 –

-1

Utwórz własny nagłówek unistd.h i dodaj potrzebne nagłówki do prototypów funkcji.

+6

Wiem, że mogę to zrobić, będę edytować pytanie, aby to wyjaśnić. Pytanie brzmiało: czy ktoś zrobił to za mnie? – AShelly

5

Nie, IIRC nie ma getopt() w systemie Windows.

Boost, jednak ma bibliotekę program_options ... która działa dobrze. Z początku będzie to wyglądało na przesadę, ale nie jest to straszne, zwłaszcza biorąc pod uwagę to, że może on obsługiwać ustawianie opcji programu w plikach konfiguracyjnych i zmiennych środowiskowych oprócz opcji wiersza poleceń.

+0

Zabawne szukanie w Google dla "getopt windows" daje to jako pierwsze trafienie: http://www.codeproject.com/KB/cpp/xgetopt.aspx –

+0

Nie trzeba było przepisywać istniejącego kodu, aby użyć Boost lub niektórych inny parser. – AShelly

+0

@AShelly: Obawiam się, że jeśli kodujesz przy użyciu API * nix, nie masz wyboru, musisz ponownie napisać istniejący kod, aby był przenośny, lub dostarczyć własną implementację brakującej funkcji. Jeśli użyjesz opcji boost :: program_opcje, to będzie działać na wielu platformach bez zmian. – paxos1977

89

Spróbuj dołączyć plik io.h. Wygląda na to, że Visual Studio jest odpowiednikiem unistd.h.

Mam nadzieję, że to pomoże.

+0

Pomógł mi, dziękuję :) – anhoppe

13

Natknąłem się na ten wątek, próbując znaleźć alternatywę dla systemu Windows dla getpid() (zdefiniowane w unistd.h). Okazuje się, że w tym process.h robi lewę. Może to pomoże ludziom, którzy znajdą ten wątek w przyszłości.

Powiązane problemy