以下命令输入到此代码中:“CREATE”,然后“QUIT”。当调用“CREATE”时,进程需要fork并在子进程中执行进一步的代码。
我的输出应为此(打印输入):
- INPUT: CREATE
- CALLED_CREATE
- CHILD_PROCESS
- INPUT: QUIT
但是,我有这个:
- INPUT: CREATE
- CALLED_CREATE
- INPUT: QUIT
- INPUT: CREATE
- CALLED_CREATE
- CHILD_PROCESS
- INPUT: QUIT
我对fork()
的理解是,父进程将继续执行代码,如果它可供父进程使用,同样对于子进程 - 从指令fork()
开始。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include "locker.h"
int main(){
char user_input[100];
int active_input = 0;
int this_pid;
while(active_input == 0){
//receive user_input
scanf("%s", user_input);
printf("INPUT: %s\n", user_input);
if(strcmp(user_input, "CREATE") == 0){
printf("CALLED_CREATE\n");
if((this_pid = fork()) < 0){
perror("Failed to fork process");
return EXIT_FAILURE;
}
//child
if(this_pid == 0){
printf("CHILD_PROCESS\n");
}
//parent
if(this_pid > 0){
//printf("PARENT_PROCESS\n");
}
}
if(strcmp(user_input, "QUIT") == 0){
active_input = 1;
break;
}
}
}
感谢您的帮助:)
答案 0 :(得分:1)
我怀疑主要的问题是你没有停止孩子的过程。例如,在您输入一次CREATE之后,子进程将打印CHILD PROCESS,但将继续在其自己的进程中循环,而父进程也是如此。
您应确保在执行有意义的操作后退出子进程。另外,如上面Chrono Kitsune所述,父母需要wait()
让子进程获得退出状态并防止僵尸。
除此之外,您的用户输入缓冲区为100个字符,打开您的程序以缓冲溢出攻击。但那是一个不同的故事。
你的代码稍微改了一些,我觉得你做了什么:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
int main() {
char user_input[100];
int this_pid;
while (1) {
//receive user_input
scanf("%s", user_input);
printf("INPUT: %s\n", user_input);
if(strcmp(user_input, "CREATE") == 0){
printf("CALLED_CREATE\n");
if((this_pid = fork()) < 0){
perror("Failed to fork process");
return EXIT_FAILURE;
}
//child
if (this_pid == 0){
printf("CHILD_PROCESS\n");
// do some interesting stuff here, and then don't forget to
exit(0);
}
}
if(strcmp(user_input, "QUIT") == 0)
break;
}
}