Tag: popen

在C中不成功使用popen()?

我可以运行以下命令 xwd -root | xwdtopnm | pnmtojpeg > screen.jpg 在Linux下的终端,它将生成我当前屏幕的截图。 我尝试使用以下代码执行以下操作: #include #include int main() { FILE *fpipe; char *command=”xwd -root | xwdtopnm | pnmtojpeg”; char line[256]; if ( !(fpipe = (FILE*)popen(command,”r”)) ) { // If fpipe is NULL perror(“Problems with pipe”); exit(1); } while ( fgets( line, sizeof line, fpipe)) { //printf(“%s”, line); puts(line); […]

C中的popen()和system()有什么区别

我想在我的C代码中执行二进制文件。 执行哪个更好? popen()或system() 编辑 :我试图使用system ,但执行过程似乎陷入最后,并没有返回到我的代码。 关于该怎么做的任何建议? 谢谢

C – 用popen获取进程的PID

我有一个用C编写的程序,它使用popen打开另一个程序。 我想获得该程序的pid或某种处理程序,以便在一定的时间限制后杀死它,或者它超过某些ram和stdout限制。 我认为这必须用ptrace完成,它需要PID,我不知道如何获取。

c:在exec()中捕获一个在子进程中运行的段错误

编辑: 我正在尝试编写一个简单的冒烟测试,其中测试了所有选项和合理的参数。 我使用popen()来执行应该测试的程序。 使用这种方法不起作用,因为如果进程因信号(SIGINT,SIGSEGV …)而死亡,来自popen()的管道不会告诉我发生了什么。 编写信号处理程序并没有帮助,因为popen创建了一个接收信号而不是我的冒烟的新过程。 感谢答案我使用pipe(),fork()和execv()来创建我自己的popen() – 版本。 当程序现在段错误时,管道是无用的(读取导致奇怪的行为 – >阻止进程,直到我向父进程发送sigkill!) 为了避免这种情况,我尝试了不同的东西,我的解决方案如下(这很简单,但我需要一段时间来弄明白)。 所以这是我的示例代码: static int child_dead = 0; void sigaction_sigchld(int signal) { /* Child died */ child_dead = 1; } int main(int argc, char *argv[], char *env[]) { char *crashing_program = “/program_path/and_name”; int ret; int byte; pid = fork(); if(pid == 0) /* Child […]

杀死一个以popen开始的进程

在使用popen打开管道进程后,有没有办法杀死已启动的进程? (使用pclose不是我想要的,因为它会等待进程完成,但我需要杀死它。)

当文件流没有新数据时如何防止fgets阻塞

我有一个popen()函数执行“tail -f sometextfile”。 只要文件流中有数据显然我可以通过fgets()获取数据。 现在,如果没有来自尾部的新数据,fgets()会挂起。 我试过ferror()和feof()无济于事。 当文件流中没有新内容时,如何确保fgets()不会尝试读取数据? 其中一个建议是select()。 由于这是针对Windows平台选择似乎不起作用,因为匿名管道似乎不起作用(请参阅此文章 )。

c popen不会抓住stderr

我正在尝试使用popen()来捕获调用的stderr,但当然它似乎并没有这样做。 有任何想法吗? 我的代码看起来或多或少像这样: popen(“nedit”, “r”); 但是我在屏幕上得到了关于非utf8的所有垃圾……

popen()可以像pipe()+ fork()那样制作双向管道吗?

我正在用C ++(主要是C)在模拟文件系统上实现管道。 它需要在主机shell中运行命令,但在模拟文件系统上执行管道本身。 我可以通过pipe() , fork()和system()系统调用实现这一点,但我更喜欢使用popen() (它处理创建管道,分叉进程,并将命令传递给shell) 。 这可能是不可能的,因为(我认为)我需要能够从管道的父进程写入,在子进程端读取,从子进程写回输出,最后从父进程读取该输出。 我的系统上popen()的手册页说可以使用双向管道,但是我的代码需要在一个只支持单向管道的旧版本的系统上运行。 通过上面的单独调用,我可以打开/关闭管道来实现这一目标。 这可能与popen() ? 对于一个简单的例子,运行ls -l | grep .txt | grep cmds ls -l | grep .txt | grep cmds ls -l | grep .txt | grep cmds我需要: 打开一个管道和进程以在主机上运行ls -l ; 读回它的输出 将ls -l的输出传回我的模拟器 打开一个管道和进程,在ls -l的管道输出上的主机上运行grep .txt 将此输出传回模拟器(卡在此处) 打开一个管道和进程,在grep .txt的管道输出上的主机上运行grep cmds 将其输出传回模拟器并打印出来 男人popen 从Mac OS X: […]

popen()替代方案

我的问题是这个问题的延伸: popen创造了一个额外的过程 动机: 1)我的程序需要创建一个在文件上tail的子项。 我需要逐行处理输出。 这就是为什么我使用popen因为它返回FILE *。 我可以轻松获取单行,执行我需要做的操作并打印它。 popen的一个问题是你没有得到孩子的pid(在我的情况下是tail命令)。 2)我的程序不应该在孩子完成之前退出。 所以我需要wait ; 但没有pid,我不能这样做。 我怎样才能实现这两个目标? 一个可能的(kludge)解决方案:执行execvp(“tail -f file> tmpfile”)并继续读取tmpfile。 不过,我不确定这个解决方案有多好。