process.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #ifndef BX_PROCESS_H_HEADER_GUARD
  6. #define BX_PROCESS_H_HEADER_GUARD
  7. #include "string.h"
  8. #include "uint32_t.h"
  9. #if BX_PLATFORM_LINUX
  10. # include <unistd.h>
  11. #endif // BX_PLATFORM_LINUX
  12. namespace bx
  13. {
  14. ///
  15. inline void* exec(const char* const* _argv)
  16. {
  17. #if BX_PLATFORM_LINUX
  18. pid_t pid = fork();
  19. if (0 == pid)
  20. {
  21. int result = execvp(_argv[0], const_cast<char *const*>(&_argv[1]) );
  22. BX_UNUSED(result);
  23. return NULL;
  24. }
  25. return (void*)uintptr_t(pid);
  26. #elif BX_PLATFORM_WINDOWS
  27. STARTUPINFO si;
  28. memset(&si, 0, sizeof(STARTUPINFO) );
  29. si.cb = sizeof(STARTUPINFO);
  30. PROCESS_INFORMATION pi;
  31. memset(&pi, 0, sizeof(PROCESS_INFORMATION) );
  32. int32_t total = 0;
  33. for (uint32_t ii = 0; NULL != _argv[ii]; ++ii)
  34. {
  35. total += (int32_t)strlen(_argv[ii]) + 1;
  36. }
  37. char* temp = (char*)alloca(total);
  38. int32_t len = 0;
  39. for(uint32_t ii = 0; NULL != _argv[ii]; ++ii)
  40. {
  41. len += snprintf(&temp[len], bx::uint32_imax(0, total-len)
  42. , "%s "
  43. , _argv[ii]
  44. );
  45. }
  46. bool ok = CreateProcessA(_argv[0]
  47. , temp
  48. , NULL
  49. , NULL
  50. , false
  51. , 0
  52. , NULL
  53. , NULL
  54. , &si
  55. , &pi
  56. );
  57. if (ok)
  58. {
  59. return pi.hProcess;
  60. }
  61. return NULL;
  62. #else
  63. return NULL;
  64. #endif // BX_PLATFORM_LINUX
  65. }
  66. } // namespace bx
  67. #endif // BX_PROCESS_H_HEADER_GUARD