【发布时间】:2013-07-02 08:18:00
【问题描述】:
我想使用 php 在远程计算机上运行 C 程序。最终目标是使用手机或任何其他计算机上的网络浏览器来控制程序。
我的 C 程序在几十分钟内从不同的传感器获取数据。它从 linux 的命令行运行,我可以通过按计算机键盘上的“q”键将其关闭。主线程是这样的:
int main(){
printf("Program is running... Press 'q' <enter> to quit\n");
fflush(stdout);
//create one thread per sensor
while (getchar() != 'q'){
}
//ask the threads to terminate
return(0);
}
每个线程执行一些 printf 来给出每个传感器的状态。我想在我的手机上监控这些值,并有一个按钮来终止远程程序。
我可以使用 system()、open() 或 proc_open() 成功监控这些值。问题是主程序中的getchar。它挂起 php 脚本...
<?php
if(isset($_POST['start'])){
$descriptorspec = array(
0 => array("pipe", "r"), // // stdin est un pipe où le processus va lire
1 => array("pipe", "w"), // stdout est un pipe où le processus va écrire
2 => array("file", "/tmp/error-output.txt", "a") // stderr est un fichier
);
$cwd = '/tmp';
$env = array();
$process = proc_open('/home/tristan/www/a.out', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
fwrite($pipes[0], 'q');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
$return_value = proc_close($process);
echo "La commande a retourné $return_value\n";
}
}
?>
使用fwrite($pipes[0], 'q'); 效果很好,但如果我使用fwrite($pipes[0], ''); 以保持程序运行,php 脚本会挂起...
编辑:我 invertigating 缓冲问题 $process = proc_open('stdbuf -i0 /home/tristan/www/a.out', $descriptorspec, $pipes, $cwd, $env); 没有成功...
有没有人知道如何以交互方式监视值和向程序发送命令?
感谢您的帮助!
【问题讨论】:
-
这个问题很有趣但很模糊。显示更多 C 代码并显示 PHP 代码
-
是的。我尊重仍然使用 C 编程的人。它是一种强大的编程语言,我们可以使用它实际访问寄存器。希望你成功
-
如果您将程序构建为作为守护程序运行并提供命令行工具来访问它,那么您可能会发现它更简单。查看 linux 如何提供服务:
$ service {service-name} restart、$ service {service-name} stop和$ service {service-name} start(cyberciti.biz/tips/…) -
你应该按照汤姆所说的去做;您可以查看这里以了解如何创建守护进程 (netzmafia.de/skripten/unix/linux-daemon-howto.html)