我正在尝试使用system()命令从c程序启动'vlc'。执行命令后,我正在执行popen()和fgets()函数以获取已启动的vlc应用程序的PID。但是fgets()没有给出PID。代码如下。它从'root'运行。 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);
注意:此代码段在solo c程序中正常运行。但它不适用于我的实际代码库,这个代码库非常大,而且其他popen()函数也被多次调用。我无法理解这个问题。请帮我。
答案 0 :(得分:0)
如果您只是在echo $!
命令中添加system
来打印后台进程PID,那么您可以让生活更轻松,那么您就不需要grep了。当然,这意味着使用popen()
代替该命令来读取PID。