Passing data between PHP and C executable in linux

前端 未结 4 514
迷失自我
迷失自我 2021-01-12 15:12

Under Linux ,if I want to pass pure string from PHP to C, how do i do that? what I\'ve tried do far is:

exec(\"./myexec.bin -a mystring\");

相关标签:
4条回答
  • 2021-01-12 15:30

    If it is more like a data structure than a string, what about using an embedded webserver? At first sight it may sound like overkill for your purpose, but mongoose for example is a very lightweight embeddable webserver:

    http://code.google.com/p/mongoose/

    There's also a nice tutorial about the exact same problem you have, transfering data between a PHP application and a C/C++ application. It's in german, though ... but maybe google translator can help:

    http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/

    0 讨论(0)
  • 2021-01-12 15:34

    try using echo and pipe the output to your C executable instead of using args:

    exec("/bin/echo | ./myexec.bin");

    as @sarnold mentioned in comments it's wrong. Look at @Linus Kleen answer.

    in your C program:

    fopen(stdin, "r");
    // ...
    
    0 讨论(0)
  • 2021-01-12 15:45

    A few options spring immediately to mind:

    • Store the data in a file and pass the filename on the command line. It's easy and simple but does require permissions to create and store files somewhere on the filesystem.

    • Open a pipe between your program and the C program; leave both processes running, at least until the C program has consumed the entire contents of your string. popen() is a convenient wrapper around this approach, but it does assume that standard input is the right destination, and it is unidirectional. Managing the pipes yourself lets you use a different file descriptor -- and you can tell the child which file descriptor to read via a command line argument. (See gpg(1)'s command line option --passphrase-fd to see what I mean.)

    • Use a SysV or POSIX shared memory segment to store you data in PHP, and then attach to the shared memory segment from your C program to read the contents. Note that shared memory segments persist, so you must clean up after them when you are done -- otherwise you will leak memory. This doesn't require permissions to create files in the filesystem and might be a nicer mechanism than dealing with pipes and keeping both processes alive long enough for one to completely write the data and the other to completely read the data.

    0 讨论(0)
  • 2021-01-12 15:53

    You could use popen() to open a pipe to the executable:

    $fp = popen('./myexec.bin', 'w');
    fwrite($fp, $data);
    pclose($fp);
    

    Then, as previously suggested, read from stdin in your C program:

    fopen(stdin, "r");
    // ...
    

    It is "safer" to use popen() rather than exec('/bin/echo') because you can write characters that would otherwise be interpreted by the shell (&, |, ...). Note that the handle returned from PHP's popen() must be closed with pclose().

    0 讨论(0)
提交回复
热议问题