我的程序似乎没有终止;为什么?
My program doesn't seem to terminate; why?
我正在使用一种叫做 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 提示。
如果您希望程序在所有子进程完成后才退出,则需要使用 wait(2) 等待它们完成:http://man7.org/linux/man-pages/man2/waitpid.2.html
Since wait returns -1 如果你的进程没有子进程,你可以在循环中调用它直到它这样做:
int status = 0;
while ((wpid = wait(&status)) > 0);
(我从 Make parent wait for all child processes 得到了那个特定的公式。)
我正在使用一种叫做 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 提示。
如果您希望程序在所有子进程完成后才退出,则需要使用 wait(2) 等待它们完成:http://man7.org/linux/man-pages/man2/waitpid.2.html
Since wait returns -1 如果你的进程没有子进程,你可以在循环中调用它直到它这样做:
int status = 0;
while ((wpid = wait(&status)) > 0);
(我从 Make parent wait for all child processes 得到了那个特定的公式。)