2015-01-16 4 views
1

Я хотел бы позвонить execl() из моего приложения Mono. Вот заявление:Выполнение системных вызовов glibc с C#

[DllImport("libc.so.6")] 
private static extern int execl(string path, string argv); 

Тогда, где pathname и arguments стандартные C# строковые объекты:

execl(pathname, pathname + " " + arguments); 

execl() вызов не работает, однако, и если я получать информацию об ошибке с perror(), Я вижу «Плохой адрес».

Я был уверен в документации, что Mono/C# автоматически преобразует строки в требуемые строки с нулевым завершением в стиле c, но я не смог заставить это работать.

Каков правильный способ сделать системные вызовы с C#/Mono? Должен ли я использовать массив типов C# sbyte, а затем \0?

ответ

1

На моей системе x64

Linux ДНК-NOTEBOOK 3.18.2-2-ARCH # 1 SMP PREEMPT пт 9 января 7:37:51 CET 2015 x86_64 GNU/Linux

Mono JIT версия компилятора 3.12.0 (tarball Thu Jan 15 18:46:56 UTC 2015).

Следующий код работает отлично

[DllImport("libc.so.6")] 
private static extern int execl(
    [MarshalAs(UnmanagedType.LPTStr)] string path, 
    [MarshalAs(UnmanagedType.LPTStr)] string argv); 

public static void Main() 
{ 
    execl("/usr/bin/bash", string.Empty); 
} 

Какая версия моно бежишь? Также можете ли вы получить отладочную информацию или оставить где-нибудь след?

Смежные вопросы