gpt4 book ai didi

c - 使用 C 将 exec 进程发送到后台?

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:03 25 4
gpt4 key购买 nike

我的问题听起来和这个一样,但不是:

Start a process in the background in Linux with C

我知道如何执行 fork() 但不知道如何将进程发送到后台。我的程序应该像支持管道和后台进程的简单命令 unix shell 一样工作。我可以使用 pipe 和 fork,但我不知道如何使用 & 将进程发送到后台,就像程序的最后一行:

~>./a.out uname
SunOS
^C
my:~>./a.out uname &

如何实现后台进程?

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define TIMEOUT (20)

int main(int argc, char *argv[])
{
pid_t pid;

if(argc > 1 && strncmp(argv[1], "-help", strlen(argv[1])) == 0)
{
fprintf(stderr, "Usage: Prog [CommandLineArgs]\n\nRunSafe takes as arguments:\nthe program to be run (Prog) and its command line arguments (CommandLineArgs) (if any)\n\nRunSafe will execute Prog with its command line arguments and\nterminate it and any remaining childprocesses after %d seconds\n", TIMEOUT);
exit(0);
}

if((pid = fork()) == 0) /* Fork off child */
{
execvp(argv[1], argv+1);
fprintf(stderr,"Failed to execute: %s\n",argv[1]);
perror("Reason");
kill(getppid(),SIGKILL); /* kill waiting parent */
exit(errno); /* execvp failed, no child - exit immediately */
}
else if(pid != -1)
{
sleep(TIMEOUT);
if(kill(0,0) == 0) /* are there processes left? */
{
fprintf(stderr,"\Attempting to kill remaining (child) processes\n");
kill(0, SIGKILL); /* send SIGKILL to all child processes */
}
}
else
{
fprintf(stderr,"Failed to fork off child process\n");
perror("Reason");
}
}

简单英语的解决方案似乎在这里: How do I exec() a process in the background in C?

Catch SIGCHLD and in the the handler, call wait().

我走在正确的轨道上吗?

最佳答案

Q: How do I send a process to the background?

答:一般来说,就是您已经在做的事情:fork()/exec()。

问:什么地方没有按您预期的那样工作?

我怀疑您可能还想要一个“nohup”(将 child 与 parent 完全分离)。

这样做的关键是在子进程中运行“setsid()”:

关于c - 使用 C 将 exec 进程发送到后台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com