Почему результаты терминала и VSCode-Code Runner отличаются? - PullRequest
0 голосов
/ 14 января 2020

Я написал игрушечный проект, связанный с концепцией процессов в операционной системе, и запустил его соответственно одной и той же командой в VSCode-Code-Runner и терминале. Я обнаружил, что результаты на удивление разные. Вывод Code Runner имеет на одну строку больше, чем вывод терминала (что не ожидается).

Снимки экрана:

code runner output

terminal output

Код:

#include <cstdlib>
//#include<cstdio>
#include <unistd.h>
#include <cstring>
#include <fcntl.h>
#include <cassert>
#include <sys/wait.h>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc,char*argv[]){
    char buf;
    int fd[2];
    if(pipe(fd)<0){
        cerr<<"pipe failed\n";
        exit(1);
    }
    char *p;
    p = (char *)malloc(12 * (sizeof(char *)));
    int rc1=fork();
    if(rc1<0)
    {
        // fork failed; exit
        cerr << "fork failed\n";
        exit(1);
    }
    else if(rc1==0){
        printf("hello, I am child (pid:%d)\n", (int)getpid());
        close(fd[0]);
        write(fd[1], "hello world\n", 12);
        return 0; //否则会继续fork一个进程
    }
    else if(rc1>0){
        printf("hello, I am parent of %d  (pid:%d)\n",
               rc1, (int)getpid());
    }
    wait(NULL);
    int rc2 = fork();
    if (rc2 < 0)
    {
        // fork failed; exit
        cerr << "fork failed\n";
        exit(1);
    }
    else if (rc2 == 0)
    {
        close(fd[1]);
        write(STDOUT_FILENO, "\n", 1);
        while (read(fd[0], &buf, 1) > 0)
        {
            write(STDOUT_FILENO, &buf, 1);
        }
        write(STDOUT_FILENO,"\n", 1);

        printf("hello, I am child (pid:%d)\n", (int)getpid());
        return 0;
    }
    else if (rc2 > 0)
    {
        printf("hello, I am parent of %d  (pid:%d)\n",
               rc2, (int)getpid());
    }
    return 0;
}
...