Articles of 进程popen

使用fclose来pipepopen是一个严重的错误?

几个月前我写了一个Linux的CGI应用程序,它使用popen()来读取命令的输出,然后用fclose()closurespipe道。 现在,我读了closurespipe道需要使用pclose() 。 手册说: popen()的返回值在所有方面都是一个标准的I / Ostream,除了它必须用pclose()而不是fclose(3)来closures。 我的代码是这样的: if ((NULL != (f = popen(command.value, "r")))) { //do something fclose(f); } 我的问题是: 我的错误有安全问题? 它的程序目前正在生产中。 在testing中,没有任何问题。 是真的需要,使用pclose()而不是fclose()修补它? 注:我只在程序中打开PIPE一次。 今天,在我本地的家里,我做了一些testing,并且fclose()和pclose()不返回表示失败的EOF。

Python 3.4.3 subprocess.Popen得到没有pipe道命令的输出?

我正在尝试将一个命令的输出分配给一个variables,而不是该命令的输出。 其原因在于,如果正在pipe理,正在讨论的命令会将未格式化的文本输出为输出,但如果正在从terminal运行,则会提供彩色格式的文本。 我需要得到这个颜色格式的文本。 到目前为止,我已经尝试了一些东西。 我已经尝试过Popen了: output = subprocess.Popen(command, stdout=subprocess.PIPE) output = output.communicate()[0] output = output.decode() print(output) 这可以让我打印输出,但它给了我input命令时得到的无格式输出。 这是有道理的,因为我在Python代码中将其pipe道化。 但是我很好奇,如果有一种方法可以将这个命令的输出直接分配给一个variables,而不需要运行pipe道本身的pipe道版本。 我也尝试了依赖于check_output的以下版本: output = subprocess.check_output(command) output = output.decode() print(output) 再次,我得到相同的未格式化输出,命令返回时,命令是pipe道。 有没有办法获得格式化的输出,命令通常从terminal给出的输出,当它不被pipe道?

linux命令在C代码上执行

我有下面的代码,我指的是这里的线程使用popen函数 int main(int argc,char *argv[]){ FILE* file = popen("ntpdate", "r"); char buffer[100]; fscanf(file, "%100s", buffer); pclose(file); printf("buffer is :%s\n", buffer); return 0; } 它输出: 21 Apr 03:03:03 ntpdate[4393]: no server can be used, exiting buffer is: 为什么printf不输出任何东西? 如果我使用ls作为命令,那么printf输出ls输出。 我在做什么错误ntpdate执行? 如果我执行下面的代码(指网页 ) #define COMMAND_LEN 8 #define DATA_SIZE 512 int main(int argc,char *argv[]){ FILE *pf; char command[COMMAND_LEN]; […]

文件*和istream:连接两个?

假设我“popen”一个可执行文件,我得到一个FILE*作为回报。 此外,假设我想“连接”这个文件到一个istream对象,以便于处理,有没有办法做到这一点?

LD_PRELOAD即使在unsetenv(“LD_PRELOAD”)之后也会影响新的子项

我的代码如下:preload.c,具有以下内容: #include <stdio.h> #include <stdlib.h> int __attribute__((constructor)) main_init(void) { printf("Unsetting LD_PRELOAD: %x\n",unsetenv("LD_PRELOAD")); FILE *fp = popen("ls", "r"); pclose(fp); } 然后在shell(小心地执行第二个命令!!): gcc preload.c -shared -Wl,-soname,mylib -o mylib.so -fPIC LD_PRELOAD=./mylib.so bash ! 要小心上一个命令,会导致无限循环的分叉“sh -c ls”。 2秒后用^ C停止,(或更好的^ Z,然后看ps)。 更多信息 这个问题在某种程度上与bash有关; 无论是作为用户运行的命令,还是作为popen执行的bash。 额外的关键因素:1)从预加载的库中执行popen,2)可能需要在库的初始化部分做popen。 如果你使用: LD_DEBUG=all LD_DEBUG_OUTPUT=/tmp/ld-debug LD_PRELOAD=./mylib.so bash 而不是最后一个命令,你将会得到许多名为/tmp/ld-debug.*的ld-debug文件。 每个分叉过程一个。 在所有这些文件中,即使LD_PRELOAD已从环境中删除,您仍会看到符号首先在mylib.so中search。

杀死进程打开popen()?

我用popen()打开了一个长期运行的过程。 为了debugging,我想在完成之前终止这个过程。 调用pclose()只是阻塞,直到孩子完成。 我怎样才能杀死这个进程? 我没有看到任何简单的方法从popen()返回的资源中获取pid,以便我可以发送一个信号。 我想我可以做一些kludgey,并尝试使用某种命令行hackery fudge到输出的pid …

通过使用popen()的套接字执行命令

任何人都可以试图实现以下服务器和客户端吗? 服务器: #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> int main(void) { int sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serv_addr = { 0 }; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(1234); bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); listen(sock, 128); struct sockaddr_in cli_addr = { 0 }; socklen_t cli_addrlen […]

无阻塞pipe道使用popen?

我想打开一个使用popen()的pipe道,并具有非阻塞的“读取”访问权限。 我怎样才能做到这一点? (我发现的例子都是阻塞/同步的)

如何从subprocess.Popen()获取输出

我想从执行Test_Pipe.py输出,我试过在Linux上的代码,但它没有工作。 Test_Pipe.py import time while True : print "Someting …" time.sleep(.1) Caller.py import subprocess as subp import time proc = subp.Popen(["python", "Test_Pipe.py"], stdout=subp.PIPE, stdin=subp.PIPE) while True : data = proc.stdout.readline() #block / wait print data time.sleep(.1) proc.stdout.readline()被封锁,所以没有数据打印出来。

Popen冲突的可执行文件/path

我想使用Popen从Python脚本中调用ImageMagick中的“convert”实用程序,如下所示: Popen(["convert", input_path, "-flop", output_file_path]) (上面的例子简单地反转了图像水平) 问题是,当我在Windows中运行脚本时,它错误地调用Windows附带的convert.exe实用程序将FAT分区转换为NTFS! (位于\ Windows \ system32) 现在,如果我在system32以外的任何目录中随机打开一个命令提示符并键入“convert”,它就会正确运行ImageMagick可执行文件。 所以,这意味着Popen自动查找system32。 我怎样才能让它不看在system32,并运行正确的可执行文件?