gpt4 book ai didi

do while 第一次后无法输入

转载 作者:太空宇宙 更新时间:2023-11-04 11:02:39 24 4
gpt4 key购买 nike

我正在尝试 fork 一个子进程,让他进入休眠状态,并在用户输入一行文本以打印输入的行数时将他唤醒。

我的代码运行良好。但是我发现奇怪的是我必须使用两个 gets(str) 语句,如果我没有使用,用户将只被提示 1 次。

如果运行代码并注释一个 gets(str) 你就会明白我的意思。

感谢您的帮助。谢谢

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <wait.h>
#include <unistd.h>
#include <signal.h>

main () {
int n;
char ch;
pid_t child;
int erret;
char str[20];
int c = 0;

if ((child = fork ()) < 0) {
perror ("fork");
exit (0);
}

else {
//waitpid(child,NULL,0);
do {
waitpid (child, NULL, 0);
printf ("Enter a line(s) \n");
//funn();
//fflush(stdin);
//scanf("%d",&n);
gets (str);
gets (str);
erret = kill (child, SIGCHLD);
printf ("Signal %d\n", erret);
if (erret >= 0) {
c++;
printf ("You have entered : %d line(s)\n", c);
//pause();
//waitpid(child,NULL,0);
}

else {
kill (child, SIGKILL);
exit (0);

}
printf ("\nPress 9 to exit :");
fflush (stdin);
scanf ("%d", &n);
fflush (stdin);
} while (n != 9);
kill (child, SIGKILL);
}
}

最佳答案

您的概念有缺陷,您在 fork 时没有指定父项和子项的作用。所以你在 gets 上有一个竞争条件。这是因为在 fork 调用之后运行了两份代码,一份由父级执行,一份由子级执行。因此,解决方法是添加一个 swichelse if 语句,将您的代码分成子部分和父部分。顺便说一句,如前所述,使用 fgets

switch(fork()):
case -1:
//Error
case 0:
// Child code
default:
// Parant code

关于do while 第一次后无法输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26372482/

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