C fgets()不';我不能在波本之后工作
我正在尝试使用system()命令从c程序启动“vlc”。执行命令后,我将执行popen()和fgets()函数,以获得已启动的vlc应用程序的PID。但是fgets()没有给出PID。代码如下所示。它正在从“根”运行。vlc是从另一个名为“sam”的用户帐户启动的,因为vlc不能从根帐户启动C fgets()不';我不能在波本之后工作,c,fork,vlc,popen,fgets,C,Fork,Vlc,Popen,Fgets,我正在尝试使用system()命令从c程序启动“vlc”。执行命令后,我将执行popen()和fgets()函数,以获得已启动的vlc应用程序的PID。但是fgets()没有给出PID。代码如下所示。它正在从“根”运行。vlc是从另一个名为“sam”的用户帐户启动的,因为vlc不能从根帐户启动 char arrcCommand[2048] = {0}; char arrcGetPIDCommand[1024] = {0}; char arrcPID[1024] = {0}; int iStatu
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()函数也被多次调用。我不能理解这个问题。请帮帮我 只要添加
echo$,您的生活就会变得更轻松
到您的系统
命令,该命令将打印后台进程PID,那么您不需要对其进行grep。当然,这意味着使用popen()
来代替该命令,以读取PID。哦,我的上帝,这是一种复杂的方式来执行您试图执行的操作。为什么不使用fork()
和execvp()
?父进程将直接知道其子进程是什么;您可以在子系统中执行I/O重定向;您根本不需要ps
命令等,也不需要管道等。对不起,我没有正确理解它。这样,我将得到子进程的pid。但如何获得vlc应用程序的pid?你能解释一下吗?对不起,我听不懂。你能提供一个例子吗?popen(“sudo-u sam vlc…&;echo$!”
然后从管道中读取以获得背景PID。不再使用system()
。谢谢。我试过了,但出现了语法错误:sh:-c:0行:意外标记“;”附近的语法错误如果在普通命令行中启动命令,语法错误也会出现不应添加代码>。只需“sudo-u sam vlc…&echo$!”
。非常感谢。它工作得很好。我也解决了我的问题。这个问题是在我用gdb调试它时发生的。可能是gdb使用了读取缓冲区。正常情况下,它工作得很好。