Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 控制台和文件的fprintf和printf输出顺序不同_C - Fatal编程技术网

C 控制台和文件的fprintf和printf输出顺序不同

C 控制台和文件的fprintf和printf输出顺序不同,c,C,我在构建代码时遇到困难: #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv){ char *input[2]; input[0]= "ls"; input[1]= "pwd"; FILE *result; char *output = "output.txt"; FILE *fout = fopen(output, "w");

我在构建代码时遇到困难:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
    char *input[2];
    input[0]= "ls";
    input[1]= "pwd";
    FILE *result;
    char *output = "output.txt";
    FILE *fout = fopen(output, "w");

    if(!fout){
        fprintf(stderr, "Can not read %s file\n", output);
        return EXIT_FAILURE;
    }

    char command[256];
    pid_t pid = 1;
    int num = 0;
    while(num < 2)
    {
        pid = fork();
        if(pid == 0){
            result = popen(input[num], "r");
            char getline[256];
            while(fgets(getline, 256, result) != NULL){
                fprintf(fout, getline);
                printf("%s", getline);
            }
            printf("\n");
        }
        else if( pid > 0){
            fprintf(fout, "#command %d\n", num);
            printf("#command %d\n", num );
            wait(NULL);
        }
        else{
            printf(stderr, "something wrong in process!");
            break;
        }
        num++;
    }

    if(pid > 0){
        pclose(result);
        fclose(fout);
    }

    return EXIT_SUCCESS;
}
output.txt
文件中:

Debug
main.c
output.txt
#command 1
#command 0
/home/lightning/workspace/prac
Debug
main.c
output.txt
/home/lightning/workspace/prac
谁能给我解释一下吗

我想要以下输出:

#command 0
Debug
main.c
output.txt
#command 1
/home/lightning/workspace/prac
#commnad NUM
从父进程打印,而
#command NUM
的结果从子进程打印


我该怎么办?

我已经很久没有用C编写代码了,但如果我读对了,你打开的是一个文本文件,派生出一个子进程(它或多或少会并行运行),让两个进程独立地异步写入该文件,然后退出

最有可能的是,这两个过程是一个字符一个字符地相互书写

您有两个选择:

  • 重新思考您的逻辑,让每个进程写入自己的文件
  • 使用文件锁;让每个进程打开文件进行独占写入(不是一个好主意)
  • 在代码中使用锁,使子进程被迫等待父进程完成编写(同样,这不是一个好主意)

  • 是的,谢谢!只需添加一个函数,每次写入文件时打开写关闭,工作火!
    #command 0
    Debug
    main.c
    output.txt
    #command 1
    /home/lightning/workspace/prac