c - fgets() 在 popen() 之后不起作用

标签 c fork vlc popen fgets

我正在尝试使用 system() 命令从 C 程序启动“vlc”。执行命令后,我将执行 popen() 和 fgets() 函数来获取已启动的 vlc 应用程序的 PID。但 fgets() 没有给出 PID。代码如下。它从“根”运行。 vlc 是从另一个名为“sam”的用户帐户启动的,因为 vlc 无法从 root 启动。

char arrcCommand[2048] = {0};
char arrcGetPIDCommand[1024] = {0};
char arrcPID[1024] = {0};
int iStatus = 0;

/*User 'sam' was added previously*/
sprintf (arrcCommand, "sudo -u sam vlc -q -I dummy /media/video.mp4 --sout '#transcode{vcodec=h264,vb=16,fps=1,scale=Auto,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{dst=232.0.0.1,port=927,mux=ts,ttl=1}' >/dev/null 2>&1 &");

iStatus = system(arrcCommand);

sprintf(arrcGetPIDCommand, "sudo -u sam ps axu | grep vlc | grep port=927 | grep -v sudo | awk '{print $2}'");
FILE* pFp = popen(arrcGetPIDCommand, "r");
if(pFp == NULL)
{
    return -1;
}
if( fgets(arrcPID, sizeof(arrcPID), pFp) != NULL )
{
    printf("\n%d\n", atoi(arrcPID));
} 
else
{
    iRetVal = -1;
    return iRetVal;
}

pclose(pFp);

注意:此代码片段在单独的 C 程序中运行良好。但它在我的实际代码库中不起作用,该代码库相当大,并且其他 popen() 函数也被多次调用。我无法理解这个问题。请帮我。

最佳答案

如果您只需将 echo $! 添加到您的 system 命令中,该命令将打印后台进程 PID,那么您就可以让生活变得更轻松,然后您就不需要 grep它。当然,这意味着使用 popen() 该命令来读取 PID。

关于c - fgets() 在 popen() 之后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26354835/

相关文章:

c - 编写一个函数来释放从链表创建的内存

c - 套接字选择()与非 block 接收

c - 生成多个子进程

android - 使用为 android 编译的 LibVLC 显示来自 MPEG2 流的 DVB 字幕

计算C程序中的空行数

c - C字符串在内存中的表示和比较

c - 信号量阻塞 child

c - 为什么当我在 fork() 之前使用 dup2() 时它不起作用?

python - 使用python-vlc从youtube视频获取屏幕截图

lua - 如何在vlc Lua扩展脚本中获取当前播放时间