gpt4 book ai didi

子进程执行整个过程

转载 作者:行者123 更新时间:2023-11-30 14:48:42 24 4
gpt4 key购买 nike

以下命令被输入到该代码中:“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;
}
}
}

感谢您的帮助:)

最佳答案

我怀疑主要问题是您没有停止子进程。例如,输入一次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;
}
}

关于子进程执行整个过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50227997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com