1

I am using something called rssgossip.py to search for a phrase in rss feeds of my choosing.

Basically, I am iterating through an array of rss feeds I want to search, and each time I'm forking the process and calling execle() on the child process. I do get the appropriate output, but it looks weird and then my terminal just sits there waiting after everything is printed.

Code

    #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;
}

Output

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.

As you can see, there is no command prompt at the end, and my terminal is just sitting there waiting. Why? It also seems odd that the command prompt shows up before printing any of the matching articles, not sure why that's happening either.

EsmaeelE
  • 2,331
  • 6
  • 22
  • 31
Aaron Parisi
  • 464
  • 7
  • 15

1 Answers1

2

Your program has already terminated, but it's hard to see that because the forked child processes are continuing to produce output afterwards.

Look at the middle of your transcript:

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

You can see that your shell has displayed a prompt in the middle of your output, at the point when the original program finished, but while the child processes are still running.

If you just hit [ENTER] after all the output is finished, you will see that your shell is in fact listening and you will get another shell prompt immediately.

If you would prefer that your program not exit until after all the child processes are done, you will need to use wait(2) to wait for them to finish: http://man7.org/linux/man-pages/man2/waitpid.2.html

Since wait returns -1 if your process has no children, you can just call it in a loop until it does so:

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

(I got that specific formula from Make parent wait for all child processes .)

Glenn Willen
  • 420
  • 4
  • 10
  • Having trouble with that, it says wait takes an int* not an int? – Aaron Parisi Sep 06 '17 at 20:28
  • @A.Pizzle See my expanded answer for how to use the wait function. When I say "wait(2)", that's a standard way of saying "the function wait(), which is documented in section 2 of the manpages." I'm not sure whether that specific jargon is considered standard on SO or not, sorry for the confusion. Specifically, the int* argument is a pointer to an int where wait() will put the exit status of the child that has exited (and the pid of the child will be returned by wait().) – Glenn Willen Sep 06 '17 at 20:29
  • You're welcome! Please click 'accept' on my answer so the site knows it was the right one! :-) – Glenn Willen Sep 06 '17 at 20:33
  • 2
    `wait()` is the simplest of the operations; you could also use `waitpid()` or `waitid()`, though the latter is not implemented everywhere (e.g. no `waitid()` in macOS Sierra 10.12.6). – Jonathan Leffler Sep 06 '17 at 20:36