C语言 执行整个过程的子项



以下命令输入到此代码中:"创建",然后"退出"。调用"CREATE"时,进程需要分叉并在子级中执行进一步的代码。

我的输出应该是这样的(打印输入(:

- 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: %sn", user_input);
if(strcmp(user_input, "CREATE") == 0){
printf("CALLED_CREATEn");
if((this_pid = fork()) < 0){
perror("Failed to fork process");
return EXIT_FAILURE;
}
//child
if(this_pid == 0){
printf("CHILD_PROCESSn");
}
//parent
if(this_pid > 0){
//printf("PARENT_PROCESSn");
}
}
if(strcmp(user_input, "QUIT") == 0){
active_input = 1;
break;
}
}
}

感谢您的帮助:)

我怀疑主要问题是你没有停止子进程。 例如,在您输入 once CREATE 后,子进程将打印 CHILD 进程,但将继续在其自己的进程中循环,而父进程也这样做。

您应该确保子进程在执行有意义的操作后退出。此外,正如上面提到的超时空狐狸,父进程需要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: %sn", user_input);
if(strcmp(user_input, "CREATE") == 0){
printf("CALLED_CREATEn");
if((this_pid = fork()) < 0){
perror("Failed to fork process");
return EXIT_FAILURE;
}
//child
if (this_pid == 0){
printf("CHILD_PROCESSn");
// do some interesting stuff here, and then don't forget to
exit(0);
}
}
if(strcmp(user_input, "QUIT") == 0)
break;
}
}

相关内容

  • 没有找到相关文章

最新更新