scanf 子进程后的垃圾值

Junk values after scanf child process

我的 scanf 语句在子进程中无法正常工作:

int main(int argc, char **argv)
{
    int operando, operatore;

    pid2 = fork();
    if (pid2 == 0) { // Figlio 2

        printf("Inserisci due numeri: ");

        scanf("%d%d", &operando, &operatore); //even though I " %d%d"...

        printf("Operando is %d and operatore is %d\n", operando, operatore);

    }


    return 0;
}

这是输出: error

查看此问题以了解您的程序中发生的情况:Child process cannot read after the exiting of parent process。最重要的部分:

The terminal is controlled by the foreground process group. When the shell invokes the parent, it makes the parent the leader of the foreground process group. The child inherits that group and has access to the terminal.

However, when the parent exits, the shell takes back control of the terminal and becomes the leader of the foreground process group. The child is no longer in the foreground process group, so it has no access to the terminal.

要让您的程序按预期工作,请在父进程中添加一个 wait 调用,以确保在子进程完成之前父进程不会退出,从而使子进程可以使用终端。

例如:

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

int main(int argc, char **argv)
{
    int operando, operatore;

    pid_t pid2 = fork();

    if (pid2 == 0) { // Figlio 2
        printf("Inserisci due numeri: ");    
        scanf("%d%d", &operando, &operatore); //even though I " %d%d"...    
        printf("Operando is %d and operatore is %d\n", operando, operatore);
    } else if (pid2 > 0) {
        wait(NULL);
    }
    
    return 0;
}

请注意,需要考虑的其他一些一般改进:

  • 始终检查函数调用的 return 值。 scanf 在使用 printf 中的结果之前尤其应该检查。同样,应该检查 fork return 值是否有错误。

调用 scanf() 失败。如果代码检查了 scanf() 的返回值,则代码可能知道这一点。除 2 以外的任何返回值都表示发生了错误。

scan() 在第一个“输入格式转换”说明符上失败,因此它从未查看第二个 'input format conversion' 说明符。

当对 scanf() 的调用中的整数 'input format conversion' 说明符失败时,目标变量将设置为 0。第二个变量显示内存中垃圾在其堆栈位置的位置.