#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char **argv) {
for(int i = 0; i < 10; i++) {
pid_t pid = fork();
if(pid == 0) {
while(1) {
pid_t pid2 = fork();
wait(NULL);
}
}
}
wait(NULL);
return(0);
}
基本上,程序运行几个hello world进程,然后用 ctrl + C 关闭。我该怎么做等待错误?像perror(等待)。我认为我必须使用int status而不是NULL,但不确定如果涉及theres orphan进程时如何处理它。
给定的代码是
$ gcc -Wall above.c
$ ./a.out
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
^C (until ctrl C is hit)
$
答案 0 :(得分:2)
函数select distinct ?property ?description ?label where{
{
wd:Q963 wdt:P31 ?typesSubject .
?instancesS (wdt:P31|wdt:P279) ?typesSubject .
?instancesS ?property ?unknown .
}
UNION
{
wd:Q42320 wdt:P31 ?typesObject .
?instancesO (wdt:P31|wdt:P279) ?typesObject .
?unknown ?property ?instancesO .
}
?claimPredicate wikibase:directClaim ?property .
?claimPredicate schema:description ?description .
?claimPredicate rdfs:label ?label .
FILTER(strstarts(str(?property),str(wdt:)))
FILTER(strstarts(str(?unknown),str(wd:)))
FILTER(LANG(?description) = "en").
FILTER(LANG(?label) = "en").
}
仅在您知道函数失败时才有用
perror
已设置,因此您要打印错误消息。你经常写
在{strong>和失败的功能之后errno
设置perror("something failed")
(函数的文档将告诉您是否
函数集errno
失败时)。
man perror
<强>概要强>
errno
<强>描述强>
#include <stdio.h> void perror(const char *s); #include <errno.h>
函数会生成标准错误消息,描述在调用系统或库期间遇到的最后一个错误 功能....
这与perror()
及其参数无关,只有在此情况下才有用
wait
失败,您想要打印有关wait
失败的错误消息。
男子等待
<强>概要强>
wait
<强>描述强>
所有这些系统调用都用于等待调用进程的子进程中的状态更改... ...
#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *wstatus); pid_t waitpid(pid_t pid, int *wstatus, int options);
和wait()
waitpid()
系统调用暂停执行调用进程,直到其子进程终止。电话wait()
是 相当于:wait(&wstatus)
...
返回值
waitpid(-1, &wstatus, 0);
:成功时,返回已终止子项的进程ID;出错时,返回-1。...
如果出现错误,这些调用中的每一个都会将
wait()
设置为适当的值。
如果您只想等待孩子退出,您可以errno
。
但是,如果您想知道退出的孩子的状态,那么您就拥有了
将指针传递给wait(NULL)
。
int
我个人更喜欢int wstatus;
pid_t wp = wait(&wstatus);
if(wp == -1)
{
// here I use perror because if wait returns -1 then there
// was an error and errno is set
perror("could not wait for child\n");
exit(1);
}
if(WIFEXITED(wstatus))
printf("Child with pid %d exited normally with status %d\n", wp, WEXITSTATUS(wstatus));
else
printf("Child with pid %d exited abnormally\n", wp);
而不是waitpid
,它可让您更好地控制。{1}}
孩子,你在等。
请参阅man wait