如何知道C程序的可执行文件是在前台还是后台运行的?

在我的C程序中,我想知道我的可执行文件是否像这样在前台运行

$./a.out 

或者像这样

 $./a.out & 

Solutions Collecting From Web of "如何知道C程序的可执行文件是在前台还是后台运行的?"

如果你是前台工作,

 getpgrp() == tcgetpgrp(STDOUT_FILENO) 

或者STDIN_FILENO或者STDERR_FILENO或者你通过附加到控制终端的文件描述符。 (如果你不确定, open("/dev/tty")总是会得到一个文件描述符给你的控制终端(如果有的话)。

这是openssh所做的SIGTTIN/SIGTTOU如果你只是想快速检查一下,比处理SIGTTIN/SIGTTOU更容易一些。

另一方面,你可能已经背景

 $ ./a.out
 ^ Z
 [1] +停止./a.out
 $ bg
 [1] + ./a.out&

或预先安排

 $ fg
 ./a.out

在任何时候。 你不能期望你可以检查一次,以后它仍然是真的(或错误的)。

从Bash参考手册:作业控制基础知识 :

后台进程是进程组ID与终端不同的进程, 这样的过程不受键盘产生的信号的影响。 只允许前台进程读取或写入终端。 后台进程尝试读取(写入)终端将被终端驱动程序发送一个SIGTTIN(SIGTTOU)信号,除非被捕获,否则会暂停进程。

所以解决的办法是为SIGTTIN安装一个信号处理程序,然后尝试从stdin读取(关闭缓冲或阻塞)。 如果你得到“0字节读”回来,那么你在前台运行。

[编辑]请注意,一个进程的状态可以改变。 您可以使用shell的作业控制命令(Ctrl-Z, bgfgjobs )来执行此操作。

据我所知,这是不可能的,通常也是不必要的。

请解释你为什么要这样做。

[无效]
IIRC,getppid()(在* nix系统上)会给你父母的ID。 如果它是0,“控制台”是你的父母,所以你在后台运行。
[/无效]

[编辑]

 int devtty; if ((devtty = open ("/dev/tty", O_RDWR)) < 0) printf ("daemon\n"); 

请注意,这只在* nix系统上有效(只有在没有人删除/ dev / tty的情况下 – 无论出于何种原因)
[/编辑]

有可能你有多个进程在后台运行:

 $ jobs [1] Stopped teamviewer [2]- Stopped vim [3]+ Stopped firefox 
  • 使用: fg %2将vim进程发送回前台。

  • 要将最后一个进程发回前台,只需使用: fg而不带参数。

  • 您还可以键入%process_name以恢复已停止的进程。

要暂停在后台运行的进程 ,请使用:

 kill -19 %job_id. 

-19信号是SIGSTOP(由Ctrl-Z发送的信号)。

你总是可以通过键入 kill -l 来查看列表

在后台/前台之间移动作业:

如果你已经键入了一个命令,并且忘记了使用& ,你可以通过输入^Z (CTRL-Z)暂停工作,然后bg ,把它放到后台,把前台工作放到后台:

 $ sleep 99 ^Z [1]+ Stopped sleep 99 $ bg [1]+ sleep 99 & 

您可以使用jobs命令列出当前shell的jobs

只要记住“退出shell”也会影响工作:

  • 在shell退出时在后台运行的作业仍在运行。
  • 当shell退出时暂停(“停止”)的作业终止。

发送信号到作业和过程

您可以使用%(JOBID)而不是进程编号(PID),使用作业编号将信号(包括终止信号)发送到从当前shell启动的作业:

 $ kill %1 [1]+ Terminated sleep 99 

要将信号发送到当前shell未启动的进程或作业,首先需要使用ps来查找其进程号(PID)。

你可以参考这个链接: 进程和作业

Linux中的一般作业控制命令是:

  • 工作 – 列出当前的工作
  • fg – 恢复队列中下一个工作
  • fg %[编号] – 恢复工作[编号]
  • bg – 将队列中的下一个作业推入后台
  • bg %[数字] – 将作业[数字]推入后台
  • kill %[number] – 杀死编号为[number]的作业
  • kill – [信号]%[编号] – 将信号[信号]发送到工作号[编号]
  • disown %[number] – 拒绝进程(不再有终端将是拥有者),所以即使在关闭终端之后,命令仍然是活着的。

这几乎是所有的人。 注意命令中作业编号的前面 – 这是告诉你正在讨论的是作业而不是进程。