我知道可以通过管道读取命令输出吗?但是获得回报价值呢?例如,我想执行:
execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);
如何获取ping命令的返回值以确定它是返回0还是1?
答案 0 :(得分:13)
这是我很久以前写的一个例子。基本上,在分叉子进程并且wait
退出状态后,使用两个宏检查状态。 WIFEXITED
用于检查进程是否正常退出,WEXITSTATUS
检查返回的数字是否正常返回:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int number, statval;
printf("%d: I'm the parent !\n", getpid());
if(fork() == 0)
{
number = 10;
printf("PID %d: exiting with number %d\n", getpid(), number);
exit(number) ;
}
else
{
printf("PID %d: waiting for child\n", getpid());
wait(&statval);
if(WIFEXITED(statval))
printf("Child's exit code %d\n", WEXITSTATUS(statval));
else
printf("Child did not terminate with exit\n");
}
return 0;
}
答案 1 :(得分:5)
您可以使用waitpid
将子进程的退出状态设置为:
int childExitStatus;
waitpid( pID, &childExitStatus, 0); // where pID is the process ID of the child.
答案 2 :(得分:4)
exec函数familly不返回,返回int仅在启动时发生错误时才会出现(就像没有找到要执行的文件一样)。
在调用 exec 之前,您必须从发送到分叉进程的信号中捕获返回值。
在你的信号处理程序中调用 wait()或 waitpid()(好吧,你也可以在你的进程中调用wait()而不使用任何信号处理程序,如果它有没别的办事。)
答案 3 :(得分:3)
无法理解和应用现有答案。
在AraK's answer中,如果应用程序有多个子进程在运行,则无法知道哪个特定的子进程产生了获得的退出状态。根据手册页,
wait()和waitpid()
wait()系统调用暂停执行调用进程,直到其中一个子进程终止。呼叫等待(&amp; status) 相当于:
waitpid(-1, &status, 0); The **waitpid()** system call suspends execution of the calling process until a **child specified by pid** argument has changed state.
因此,要获取特定子进程的退出状态,我们应该将答案重写为:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int number, statval;
int child_pid;
printf("%d: I'm the parent !\n", getpid());
child_pid = fork();
if(child_pid == -1)
{
printf("could not fork! \n");
exit( 1 );
}
else if(child_pid == 0)
{
execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);
}
else
{
printf("PID %d: waiting for child\n", getpid());
waitpid( child_pid, &statval, WUNTRACED
#ifdef WCONTINUED /* Not all implementations support this */
| WCONTINUED
#endif
);
if(WIFEXITED(statval))
printf("Child's exit code %d\n", WEXITSTATUS(statval));
else
printf("Child did not terminate with exit\n");
}
return 0;
}
随意将此答案转换为AraK答案的编辑。
答案 4 :(得分:1)
您可以使用exec
来代替popen
系列。然后使用fgets
或fscanf
读取输出。
char buff[MAX_BUFFER_SIZE];
FILE *pf = popen("your command", "r");
fscanf(pf, "%s", buff);
pclose(pf);
答案 5 :(得分:0)
您可以等待子进程并获取其退出状态。 系统调用是等待(pid),尝试阅读它。