Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fgets()不';我不能在波本之后工作_C_Fork_Vlc_Popen_Fgets - Fatal编程技术网

C fgets()不';我不能在波本之后工作

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

我正在尝试使用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 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使用了读取缓冲区。正常情况下,它工作得很好。