我知道什麼:作業控制在Linux中使用C
當一個進程正在運行,我可以按「Ctrl + Z」,並暫停了。與bg
和fg
命令我可以運行它在「後臺」或「前景」模式。
什麼我aksing:
有沒有辦法進程暫停,將其發送到用C背景或前景運行?
編輯: 我有進程ID。例如,我想將該進程發送到後臺。
我知道什麼:作業控制在Linux中使用C
當一個進程正在運行,我可以按「Ctrl + Z」,並暫停了。與bg
和fg
命令我可以運行它在「後臺」或「前景」模式。
什麼我aksing:
有沒有辦法進程暫停,將其發送到用C背景或前景運行?
編輯: 我有進程ID。例如,我想將該進程發送到後臺。
您可以使用kill(pid, SIGSTOP)
掛起它,但使其前景或後臺是運行它的shell的函數,因爲它實際影響的是shell是否立即顯示提示(並接受新命令)或等待直到工作退出。除非shell提供RPC接口(如DBus),否則沒有乾淨的方法來更改等待/不等待標誌。
你總是可以使用gdb/ptrace作爲RPC ... – geocar
@geocar:在shell的內存空間中查找標誌,然後通過調試API進行更改,並不符合「** clean **方法」 IMO。 –
你不能。 bg
和fg
是shell命令,並且不能從C的任意shell中調用命令。
通常的方法是分離子進程並退出父進程。 See this for a simple example。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
static void daemonize(void)
{
pid_t pid, sid;
/* already a daemon */
if (getppid() == 1) return;
/* Fork off the parent process */
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
/* If we got a good PID, then we can exit the parent process. */
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
/* At this point we are executing as the child process */
/* Change the file mode mask */
umask(0);
/* Create a new SID for the child process */
sid = setsid();
if (sid < 0)
{
exit(EXIT_FAILURE);
}
/* Change the current working directory. This prevents the current
directory from being locked; hence not being able to remove it. */
if ((chdir("/")) < 0)
{
exit(EXIT_FAILURE);
}
/* Redirect standard files to /dev/null */
freopen("/dev/null", "r", stdin);
freopen("/dev/null", "w", stdout);
freopen("/dev/null", "w", stderr);
}
int main(int argc, char *argv[])
{
daemonize();
/* Now we are a daemon -- do the work for which we were paid */
return 0;
}
一個Linux過程通常可以通過發送它的SIGSTOP信號或恢復通過發送它SIGCONT信號被暫停。在C中,
#include <signal.h>
kill(pid, SIGSTOP);
kill(pid, SIGCONT);
進程可以使用pause()
掛起自己。
「前景」和「背景」模式不是過程的屬性。它們是父shell進程如何與它們交互的屬性:在fg模式下,shell的輸入被傳遞給子進程,並且shell等待子進程退出。在bg模式下,shell自己接受輸入,並且與子進程並行運行。
感謝'#包括
可能發送了SIGSTP信號,但是我不知道你是否可以程序化的方式恢復它作爲bg或fg進程相對於運行該進程的shell(我認爲你可以,但我可能是錯誤的)。你可以嘗試使用'system',但我不確定像'system(「bg 1」)'這樣的東西是可行的,因爲作業對運行中的shell是「本地」的,而afaik系統可以執行它自己的「shell解釋器」實例,或者無論如何 – ShinTakezou