是否有替代unistd.h for Windows(Visual C)?

AShelly 158 c c++ windows portability unistd.h

我正在将一个为Unix编写的相对简单的控制台程序移植到Windows平台(Visual C++ 8.0).所有源文件都包含"unistd.h",它不存在.删除它,我得到关于'srandom','random'和'getopt'错误原型的投诉.我知道我可以替换随机函数,我很确定我可以找到/ hack-up一个getopt实现.

但我相信其他人也遇到了同样的挑战.我的问题是:Windows中有"unistd.h"端口吗?至少有一个包含那些具有本机Windows实现的功能 - 我不需要管道或分叉.

编辑:

我知道我可以创建我自己的"unistd.h",其中包含我需要的东西的替换 - 特别是在这种情况下,因为它是一个有限的集合.但是,由于它似乎是一个常见的问题,我想知道是否有人已经为更大的功能部分完成了工作.

无法在工作中切换到不同的编译器或环境 - 我坚持使用Visual Studio.

AShelly.. 167

由于我们无法在互联网上找到版本,让我们在这里开始.
Windows的大多数端口可能只需要完整Unix文件的子集.
这是一个起点.请根据需要添加定义.

#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.
 * /sf/ask/17360801/
 */

#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  */

  • 完整的GNU getopt端口位于:http://www.codeproject.com/KB/cpp/getopt4win.aspx (20认同)
  • 不,`ssize_t`是正确的:http://www.delorie.com/gnu/docs/glibc/libc_239.html (3认同)
  • 在某些系统上,`ssize_t`应该是'long`(即64位). (2认同)

小智.. 107

尝试包含该io.h文件.它似乎是Visual Studio的等价物unistd.h.

我希望这有帮助.

  • 我尝试了io.h,但无法从中找到“ S_ISDIR”,“ mkdir”等。 (2认同)

e.James.. 24

我建议使用mingw/msys作为开发环境.特别是如果你正在移植简单的控制台程序.Msys在Windows上实现类似Unix的shell,而mingw是GNU编译器集合(GCC)的端口以及Windows平台的其他GNU构建工具.它是一个开源项目,非常适合这项任务.我目前用它来为Windows XP构建实用程序和控制台应用程序,它肯定有unistd.h你正在寻找的那个头.

安装过程可能有点棘手,但我发现最好的起点是MSYS.

  • 而这几天MSYS2 (3认同)

小智.. 14

我在试图寻找getpid()(替代unistd.h)的Windows替代品时偶然发现了这个线程.事实证明,包括process.h诀窍.也许这有助于将来找到这个主题的人.


paxos1977.. 5

不,IIRC 在Windows上没有getopt().

然而,Boostprogram_options库...它可以正常工作.一开始它看起来有些过分,但它并不可怕,特别是考虑到除了命令行选项之外它还可以处理配置文件和环境变量中的设置程序选项.