Hay un reemplazo para unistd.h para Windows (Visual C)?


Estoy portando un programa de consola relativamente simple escrito para Unix a la plataforma Windows ( Visual C++ 8.0). Todos los archivos fuente incluyen "unistd.h", que no existe. Quitándolo, recibo quejas sobre misssing prototipos para 'srandom', 'random', y 'getopt'. Sé que puedo reemplazar las funciones aleatorias, y estoy bastante seguro de que puedo encontrar/hack-up una implementación getopt.

Pero estoy seguro de que otros se han encontrado con el mismo desafío. Mi pregunta es: ¿hay un puerto de "unistd.¿a Windows? Al menos una con las funciones que tienen una implementación nativa de Windows - no necesito canalizaciones o bifurcaciones.

EDITAR :

Sé que puedo crear mi propio "unistd.h " que contiene reemplazos para las cosas que necesito-especialmente en este caso, ya que es un conjunto limitado. Pero como parece un problema común, me preguntaba si alguien ya había hecho el trabajo para un subconjunto más grande de la funcionalidad.

Cambiar a otro compilador o entorno no es posible en el trabajo-estoy atascado con Visual Studio.

Author: Peter Mortensen, 2008-12-04

6 answers

Dado que no podemos encontrar una versión en Internet, comencemos una aquí.
La mayoría de los puertos a Windows probablemente solo necesitan un subconjunto del archivo Unix completo.
Aquí hay un punto de partida. Agregue definiciones según sea necesario.

#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  */
 143
Author: AShelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-07 21:02:31

Intenta incluir el archivo io.h. Parece ser el equivalente de unistd.h en Visual Studio.

Espero que esto ayude.

 99
Author: anonymous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-11 22:02:26

Recomendaría usar mingw/msys como un entorno de desarrollo. Especialmente si está portando programas de consola simples. Msys implementa un shell similar a Unix en Windows, y mingw es una adaptación de la colección de compiladores de GNU (GCC) y otras herramientas de compilación de GNU a la plataforma Windows. Es un proyecto de código abierto, y muy adecuado para la tarea. Actualmente lo uso para construir programas de utilidad y aplicaciones de consola para Windows XP, y sin duda tiene ese encabezado unistd.h que eres buscando.

El procedimiento de instalación puede ser un poco complicado, pero descubrí que el mejor lugar para comenzar es en MSYS.

 23
Author: e.James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-11 21:51:11

Me topé con este hilo mientras intentaba encontrar una alternativa de Windows para getpid() (definida en unistd.h). Resulta que incluir process.h hace el truco. Tal vez esto ayuda a las personas que encuentran este hilo en el futuro.

 13
Author: Eelke Spaak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-23 14:07:40

No, IIRC no hay getopt() en Windows.

Boost , sin embargo, tiene la biblioteca program_options... lo cual funciona bien. Parecerá exagerado al principio, pero no es terrible, especialmente teniendo en cuenta que puede manejar la configuración de opciones de programa en archivos de configuración y variables de entorno, además de las opciones de la línea de comandos.

 5
Author: paxos1977,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-11 21:55:45

Crea tu propio unistd.h cabecera e incluir las cabeceras necesarias para los prototipos de funciones.

 -1
Author: INS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-04 20:40:41