草庐IT

php exec/shell_exec/system/popen/proc_open 在 linux 上无限次运行调用脚本本身

我有一个脚本,它使用php-l检查php文件中的语法错误。它在Windows中运行良好,但在Linux中输出不正确:正在检查语法错误的文件exec_ip.php的内容是(它有要检查的语法错误):脚本是:$slash=file_get_contents('exec_ip.php');//echo$slash;$tmpfname=tempnam("tmp","PHPFile");file_put_contents($tmpfname,$slash);exec("php-l".$tmpfname,$error);$errtext='';foreach($erroras$errline)$er

php - exec和popen的区别

我想在我的服务器上运行一个外部PHP文件,我发现我可以使用exec或popen。我读到popen用于Windows,而exec用于Linux。另一方面,我看到了popen也可以用于Linux的例子。我还是个新手。可能吗?如果exec和popen都有效,您推荐哪个用于Linux?请问有什么优点,我还是一头雾水。 最佳答案 如果您只需要执行外部应用程序,请使用exec()或shell_exec()。如果您需要指针,则使用popen(),这类似于fopen()对文件所做的事情。fopen()只是打开指向文件的指针,没有别的。然后您需要其他

php - 杀死用popen()打开的进程?

我正在使用popen()打开一个长时间运行的进程。为了调试,我想在进程完成之前终止它。调用pclose()只会阻塞直到子进程完成。如何终止进程?我没有看到任何简单的方法来从popen()返回的资源中获取pid,以便我可以向它发送信号。我想我可以做一些笨拙的事情,并尝试使用某种命令行hackery将pid伪造到输出中...... 最佳答案 好吧,找到了解决方案:我切换回了proc_open()而不是popen()。然后就这么简单:$s=proc_get_status($p);posix_kill($s['pid'],SIGKILL);

c - 使用 fclose 到 popen 的管道是一个严重的错误?

几个月前,我为Linux编写了一个CGI应用程序,它使用popen()读取命令的输出,然后使用fclose()关闭管道.现在,我读到关闭管道需要使用pclose()。手册说:Thereturnvaluefrompopen()isanormalstandardI/Ostreaminallrespectssavethatitmustbeclosedwithpclose()ratherthanfclose(3).我的代码是这样的:if((NULL!=(f=popen(command.value,"r")))){//dosomethingfclose(f);}我的问题是:我的错误有安全问题吗?

Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令输出?

我正在尝试将命令的输出分配给变量,而命令认为它正在被管道传输。这样做的原因是,所讨论的命令在通过管道传输时会提供未格式化的文本作为输出,但在从终端运行时会提供彩色格式化文本。我需要获取这种颜色格式的文本。到目前为止,我已经尝试了一些事情。我试过Popen是这样的:output=subprocess.Popen(command,stdout=subprocess.PIPE)output=output.communicate()[0]output=output.decode()print(output)这将让我打印输出,但它会给我在管道命令时获得的未格式化输出。这是有道理的,因为我在Pyt

C: 由 popen() 函数执行的 Linux 命令不显示结果

我有下面的代码,我引用了here上的线程使用popen函数intmain(intargc,char*argv[]){FILE*file=popen("ntpdate","r");charbuffer[100];fscanf(file,"%100s",buffer);pclose(file);printf("bufferis:%s\n",buffer);return0;}输出:21Apr03:03:03ntpdate[4393]:noservercanbeused,exitingbufferis:为什么printf不输出任何东西?如果我使用ls作为命令,则printf输出ls输出。我在做

c - 为什么 popen() 调用 shell 来执行进程?

我目前正在阅读并试验在Linux上从C代码中运行程序的不同可能性。我的用例涵盖了所有可能的场景,从简单地运行和忘记进程,读取或写入进程,到读取并写入它。对于前两个,popen()非常易于使用并且运行良好。我知道它在内部使用了某些版本的fork()和exec(),然后调用一个shell来实际运行命令。对于第三种情况,popen()不是一个选项,因为它是单向的。可用的选项是:手动fork()和exec(),加上pipe()和dup2()作为输入/输出posix_spawn(),内部根据需要使用上面的方法我注意到这些可以实现与popen()相同的效果,但我们可以完全避免调用额外的sh。这听起

python - 为什么 subprocess.Popen 参数长度限制小于操作系统报告的长度?

我在Linux3.16.0上运行Python3.4.3。我想使用subprocess.Popen运行一个带有长单个参数的命令(一个复杂的Bash调用),大约200KiB。根据getconf和xargs,这应该在我的限制范围内:$getconfARG_MAX2097152$xargs--show-limits然而,Python失败的限制非常小:>>>subprocess.Popen('echo%s>/dev/null'%('a'*(131072-4096)),shell=True,executable='/bin/bash')>>>subprocess.Popen('echo%s>/de

python - 使用 popen 和专用的 TTY Python 运行交互式 Bash

我需要在Python的单独进程中运行一个交互式Bash实例,它有自己的专用TTY(我不能使用pexpect)。我使用了我在类似程序中经常看到的这段代码片段:master,slave=pty.openpty()p=subprocess.Popen(["/bin/bash","-i"],stdin=slave,stdout=slave,stderr=slave)os.close(slave)x=os.read(master,1026)printxsubprocess.Popen.kill(p)os.close(master)但是当我运行它时,我得到以下输出:$./pty_try.pybas

c - 使用popen的非阻塞管道?

我想使用popen()打开管道并对其进行非阻塞“读取”访问。我怎样才能做到这一点?(我找的例子都是阻塞/同步的) 最佳答案 设置如下:FILE*f=popen("./output","r");intd=fileno(f);fcntl(d,F_SETFL,O_NONBLOCK);现在你可以阅读:ssize_tr=read(d,buf,count);if(r==-1&&errno==EAGAIN)nodatayetelseif(r>0)receiveddataelsepipeclosed完成后,清理:pclose(f);