我在哪里用fork代码放置perror(" wait")

时间:2018-03-22 01:52:48

标签: c fork

#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)
$

1 个答案:

答案 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