我可以在终端上运行一个程序:./program &
但我尝试使用execvp进行操作并且它不起作用:
pid = fork();
char *argv[3] = {"./program", "&", NULL};
if ( pid == 0 ) {
execvp( argv[0], argv );
}
else{
wait(NULL);
}
我在这里做错了什么?
答案 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。您通常需要等待一些(例如wait
,wait
,wait4(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/null
,nohup(1),sh
,batch
或{{1}但是你通常不需要那个。
(不理解你的动机,以及为什么你想在background中运行某些东西,我们无法帮助你更多)