【问题标题】:How to get return error code of popen?如何获取 popen 的返回错误码?
【发布时间】:2019-01-02 14:50:58
【问题描述】:

我想要'popen'返回的错误代码。

打开命令如下:

fp = popen("/system/bin/pgrep -f  "/system/bin/ffmpeg -loglevel quiet -re -i /data/misc/qmmf/LiveStreaming_FIFO_1.264 -codec copy -f rtsp -rtsp_transport tcp rtsp://11.11.11.11:554/live/stream1?wowzatoken=B-VDkZmspHh-G49SQIKghznGAHryq5zNc3NE7KEDgx8=" ","r");

我正在获取当前正在运行的 ffmpeg 进程的 PID,并且正在使用数组中的文件指针读取这个 popen()。然后,读取 PID(char by chat 并使用 atoi()) 并杀死该 PID。

检查(fp == NULL),但没有得到空指针。

主要是,我想杀死那个 ffmpeg 进程。不是所有正在运行的ffmpeg进程,而是以名称区分的特定进程。

除此之外还有其他方法吗?

任何建议都会有所帮助。

【问题讨论】:

  • 这是C吗?在 Linux 系统上?
  • 您的示例在第一个参数中也有双引号。

标签: process kill


【解决方案1】:

假设是 Linux 系统,man 3 popen 解释了编程接口。当 fork/pipe 调用失败或无法分配内存时,popen() 将返回 NULL。成功时返回I/O 流指针。除非为变量分配新值,否则变量的值不会改变。

要等待进程终止,您应该使用pclose(),它会在出错时返回-1。此外,如果发生错误,这两个函数都会设置errno

如果您需要可靠地获取子进程的 PID,您需要在代码中调用 fork() 并使用它的返回值。由于您不会使用popen(),因此您还需要在代码中设置管道。

【讨论】:

    【解决方案2】:

    我不知道我是否完全理解您的问题,但这就是手册页中关于 popen() 错误的内容:

    返回值
    如果 fork(2) 或 pipe(2) 调用失败,或者无法分配内存,popen() 函数将返回 NULL。
     
    错误
    如果内存分配失败,popen() 函数不会设置 errno。如果底层 fork(2) 或 pipe(2) 失败,则正确设置 errno。如果类型参数无效,并且检测到这种情况,则将 errno 设置为 EINVAL。

    除了检查返回值之外,你还在检查errno吗?

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 2013-01-30
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多