我查看了史蒂文斯,并在Posix程序员指南中,我能找到的最好的是
当流程开始时,可以使用称为环境的字符串数组.外部变量指向此数组,外部变量
environ定义为:
extern char **environ;
它是ENVIRON已经我犹豫变量.我想说
- 调用进程/ shell已经分配了空终止字符串块
- 'external'变量environ用作getenv()的入口点.
- 事实上可以随意在静态初始化程序中调用getenv().
但我无法保证environ的"静态初始化" 优先于所有其他静态初始化代码.我是否想过这个?
在我的平台上(AMD Opteron,Redhat 4,GCC 3.2.3),设置LD_DEBUG表明在调用静态初始化程序之前environ已设置.这是一个很好的事情要知道; 谢谢,@ codelogic.但这并不一定是我在所有平台上得到的结果.
此外,虽然我直观地同意@ChrisW关于C/C++运行时库的行为,但这只是我基于经验的直觉.所以任何能够在静态初始化程序之前使用来自某个地方的权威保证环境的人都会被称为奖励积分!
我目前正在将进程组实现到我的操作系统项目的POSIX子系统中.但是,我对POSIX规范(setsid)(以及维基百科的进程组页面)感到有些困惑.
我们的终端层将SIGINT发送到前台进程(组,其id应该等于组长的PID).在这种情况下,该前台进程(我们的"登录"应用程序)通过调用成为组长setsid.当用户登录时,程序会分叉并执行用户的shell.在这个阶段,我的理解是我setpgid在打电话之前给分叉的孩子打电话exec*.这意味着执行的程序从一开始就是过程组的一部分.
如果我想在进程组之外运行新分叉的子进程,我只能setsid在调用之前调用分叉的子进程exec*.
它是否正确?我应该检查或做的是否有任何非常模糊的东西?
作为一个后续问题,我相信我已经知道,是否需要fork转移团体会员资格?或者是setpgid每次fork通话后必须使用的东西?我收集的进程组是fork从POSIX定义转移的fork.
提前致谢.
这就是我想要的:我为POSIX编写了一个巨大的遗留C/C++代码库,包括一些非常类似POSIX的东西,比如pthreads.这可以在Cygwin/GCC上编译,并在Windows下使用Cygwin DLL作为可执行文件运行.
我想要做的是将代码库本身构建到Windows DLL中,然后我可以从C#中引用它并在其周围编写一个包装器以编程方式访问它的某些部分.
我在http://www.cygwin.com/cygwin-ug-net/dll.html上使用非常简单的"hello world"示例尝试了这种方法,它似乎不起作用.
#include <stdio.h>
extern "C" __declspec(dllexport) int hello();
int hello()
{
printf ("Hello World!\n");
return 42;
}
Run Code Online (Sandbox Code Playgroud)
我相信我应该能够使用以下内容引用在C#中使用上述代码构建的DLL:
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int hello();
static void Main(string[] args)
{
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "helloworld.dll");
IntPtr pDll = LoadLibrary(path);
IntPtr pAddressOfFunctionToCall = GetProcAddress(pDll, "hello");
hello hello = (hello)Marshal.GetDelegateForFunctionPointer(
pAddressOfFunctionToCall,
typeof(hello));
int theResult …Run Code Online (Sandbox Code Playgroud) 在类似POSIX的系统上,命令行参数的最大长度是多少?
为了澄清,我正在寻找每个命令行参数的最大长度,而不是最大参数数.
我试图将两个参数传递给C中的一个线程.我创建了一个数组(大小为2),并试图将该数组传递给线程.这是将多个参数传递给线程的正确方法吗?
// parameters of input. These are two random numbers
int track_no = rand()%15; // getting the track number for the thread
int number = rand()%20 + 1; // this represents the work that needs to be done
int *parameters[2];
parameters[0]=track_no;
parameters[1]=number;
// the thread is created here
pthread_t server_thread;
int server_thread_status;
//somehow pass two parameters into the thread
server_thread_status = pthread_create(&server_thread, NULL, disk_access, parameters);
Run Code Online (Sandbox Code Playgroud) 有没有人知道GLib的GAsyncQueue与POSIX message_queue相对于线程间通信的相对性能?我将有许多小消息(单向和请求 - 响应类型),在Linux上用C实现(现在;可能稍后移植到Windows).我正在尝试决定使用哪一个.
我发现使用GLib更便于携带,但POSIX mq具有能够选择或轮询它们的优点.
但是,我没有找到有关其性能更好的任何信息.
SA_RESTART根据man 信号(7),如果在安装信号处理程序时使用了标志,则内核可以透明地重启某些系统调用:
如果对信号处理程序中断了对以下某个接口的阻塞调用,则在使用SA_RESTART标志后,如果信号处理程序返回,则调用将自动重新启动 ; 否则呼叫将失败并显示错误EINTR:
然后它提到了一些可以(并且不能)重新启动的系统调用,但是close()在任何一个地方都没有提到,我怎么知道是否close()可以重启或其他任何功能?是POSIX指定它还是特定于Linux的行为?我在哪里可以找到更多信息?
我需要创建两个子进程,每个子进程调用execvpater被分叉,可执行文件在它们之间共享POSIX信号量.
我是否需要创建共享内存或仅实现命名信号量?
我从以下链接得到两个答案:
但我对如何继续实施感到困惑.