我正在尝试使用 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/