我的程序似乎并没有终止;为什么?

问题描述:

我正在使用名为rssgossip.py的东西来搜索我选择的rss提要中的短语。我的程序似乎并没有终止;为什么?

基本上,我通过一个我想搜索的rss提要数组进行迭代,并且每次我分叉进程并在子进程上调用execle()。我确实得到了合适的输出,但它看起来很奇怪,然后我的终端就坐在那里等待所有打印完成。

代码

#include <stdio.h> 
    #include <errno.h> 
    #include <unistd.h> 
    #include <string.h> 

    int main(int argc, char *argv[]) { 
     char *feeds[] = {"http://feeds.washingtonpost.com/rss/lifestyle", 
        "http://feeds.washingtonpost.com/rss/world", 
        "http://feeds.washingtonpost.com/rss/opinions"}; 

     int num_feeds = 3; 
     if(argc < 2) { 
      fprintf(stderr, "You need to tell me a search phrase.\n"); 
      return 1; 
     } 
     char *phrase = argv[1]; // this will be the phrase you to search for in the rss feed, passed as an argument 
    printf("we are going to search for \"%s\"\n", phrase); 
    int i; 
    for(i = 0; i < num_feeds; i ++) { 
     char var[255]; 
     sprintf(var, "RSS_FEED=%s", feeds[i]); 
     printf("we are going to search this feed: %s\n", var); 
     char *my_env[] = {var, NULL}; 
     // I believe that once we call execle, the while loop stops because we've totally replaced the process! (we need fork...) 
     pid_t pid = fork(); 
     printf("pid: %d\n", pid); 
     if(pid == -1) { // -1 indicates that fork() had a problem cloning the process 
      fprintf(stderr, "Can't fork process: %s\n", strerror(errno)); 
      return 1; 
     } 
     if(pid == 0) { // isn't a non-zero number for the parent process?? NO, this is like pid==0, i.e. child process 
      printf("running a child process now\n"); 
      if(execle("/usr/bin/python", "/usr/bin/python", 
        "./rssgossip/rssgossip.py", phrase, NULL, my_env) == -1) { 
       fprintf(stderr, "Can't run script: %s\n", strerror(errno)); 
       return 1; 
      } 
     } 
    } 

    return 0; 
} 

输出

aarons-MacBook-Pro:ch9 aaronparisi$ ./news hi 
we are going to search for "hi" 
we are going to search this feed: RSS_FEED=http://feeds.washingtonpost.com/rss/lifestyle 
pid: 68853 
we are going to search this feed: RSS_FEED=http://feeds.washingtonpost.com/rss/world 
pid: 68854 
we are going to search this feed: RSS_FEED=http://feeds.washingtonpost.com/rss/opinions 
pid: 0 
running a child process now 
pid: 0 
running a child process now 
pid: 68855 
pid: 0 
running a child process now 
aarons-MacBook-Pro:ch9 aaronparisi$ U.S. general in Afghanistan apologizes for highly offensive leaflets 
How Burma's Rohingya crisis went from bad to worse 
Sir Richard Branson is riding out Hurricane Irma in the wine cellar on his private island 
Britains royal family announces third pregnancy for Duke and Duchess of Cambridge 
Fashion is finally figuring out diversity in ways that actually matter 
The Salt Line is an instant hit, with superb seafood and a view to match 
The 2017 Washington Post Travel photo contest winners and finalists 
Ask Amy: New hire struggles with workplace racism 
Hints From Heloise: Kitchen creativity 
Miss Manners: Helping a young child deflect questions 
A laughing matter 
History shows us how calamitous the North Korea crisis could become 
These Washington players didnt just stick to their college major 
The only thing less fair than the electoral college is the scoring in tennis 
With DACA, Jeff Sessions bent Trump to his will - again 
Washington Post's Scott Wilson is out as national editor 
Who first said, 'The best government is that which governs least'? Not Thoreau. 

正如你所看到的,有结尾没有命令提示符,我的终端只是坐在那里等待。为什么?在打印任何匹配的文章之前,命令提示符显示出来似乎也很奇怪,但不知道为什么会发生这种情况。

您的程序已经终止,但很难看到,因为分叉的子进程在继续产生输出。

看看你的成绩单中间:

running a child process now 
aarons-MacBook-Pro:ch9 aaronparisi$ U.S. general in Afghanistan apologizes for highly offensive leaflets 

你可以看到你的shell已经显示一个提示在输出的中间,在该点的原始程序完成后,但在子进程仍在运行。

如果您在所有输出完成后只敲[ENTER],您将看到您的shell实际上正在侦听,您将立即得到另一个shell提示。

如果你希望你的程序不会退出直到所有子进程完成后,您将需要使用的等待(2)等待他们完成:http://man7.org/linux/man-pages/man2/waitpid.2.html

由于等待返回-1,如果你的过程中有没有孩子,你可以到它这样做只是把它在一个循环:

int status = 0; 
while ((wpid = wait(&status)) > 0); 

(我得到了具体的公式从Make parent wait for all child processes。)

+0

具有带麻烦,它说等待接受一个int *不是int? –

+0

@ A.Pizzle查看我的扩展答案,了解如何使用等待函数。当我说“等待(2)”时,这是一种标准的方式来表示“函数wait()”,这在manpages的第2部分中有记录。“我不确定这个特定的术语是否被认为是标准的,对于混淆抱歉。 具体而言,int *参数是一个指向int的指针,其中wait()将放弃已退出子节点的退出状态(并且wait()将返回子节点的pid。) –

+0

好的;得到它的工作,非常感谢! –