C - 如何使用exec在后台运行程序?

时间:2017-10-21 04:48:56

标签: c exec

我可以在终端上运行一个程序:./program &

但我尝试使用execvp进行操作并且它不起作用:

            pid = fork();
            char *argv[3] = {"./program", "&",  NULL};

            if ( pid == 0 ) {
                execvp( argv[0], argv );
            }
            else{
                wait(NULL);
            }

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

"&"数组中的argv不会按照您的意愿执行,可能是您问题的根源。这是程序参数的位置,&是shell命令,而不是程序参数。删除它,因为./program无论如何都会在一个单独的进程中运行,因为你已经分叉了。

答案 1 :(得分:1)

作为answered by Greg Hewgill,结尾mydf %>% slice(seq_len(tail(which(WeekDay== "Friday"), 1))) %>% group_by(ID, grp = lag(cumsum(WeekDay == "Friday"), default = 0)) %>% summarise(Date = Date[WeekDay == "Friday"], Var = sum(Var, na.rm = TRUE)) %>% ungroup() %>% select(-grp) # A tibble: 5 x 3 # ID Date Var # <fctr> <date> <dbl> #1 A 2017-09-08 1 #2 A 2017-09-15 9 #3 A 2017-09-22 11 #4 B 2017-08-04 15 #5 B 2017-08-11 10 是与job control相关的shell语法(技术上不是shell命令)。

在你的问题中,不清楚你为什么需要它。您可以不使用&,并且您的代码应该可以使用。另请阅读background processes,关于terminal emulators,关于process groups。阅读tty demystified

顺便说一句,你可以代替"&"使用waitpid(2)并指定pid。您通常需要等待一些(例如waitwaitwait4(2)等等)以避免zombie processes。您可能希望处理waitpid信号,但请阅读signal(7)&amp; signal-safety(7)

也许你想使用daemon(3)功能。另请参阅setsid(2)setpgrp(2)credentials(7)。否则,您可能应该在程序中稍后调用SIGCHLD。您可能希望将(使用dup2(2)),或许wait重定向到其他open(2) - ed文件描述符,某些pipe(7)等等,<您的子进程的em> stdin (和/或 stdout stderr )。您可能还希望使用poll(2)多路复用输入或输出。

您的代码应handle the failure fork(2)(当它给出-1时),在这种情况下可能使用perror(3)。您还应该处理execvp(3)的失败。

在某些有限且特定的特定情况下,您可能需要popen(3) /dev/nullnohup(1)shbatch或{{1}但是你通常不需要那个。

(不理解你的动机,以及为什么你想在background中运行某些东西,我们无法帮助你更多)