potens()在popen()之后不起作用

时间:2014-10-14 07:19:34

标签: c fork vlc popen fgets

我正在尝试使用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()函数也被多次调用。我无法理解这个问题。请帮我。

1 个答案:

答案 0 :(得分:0)

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