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

时间:2012-09-13 16:19:57

标签: 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");

    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;
}

我将fprintf()放在printf()旁边,但结果不同。

我在控制台上收到以下内容:

#command 0
Debug
main.c
output.txt

#command 1
#command 1
/home/lightning/workspace/prac

/home/lightning/workspace/prac

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的结果。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

自从我用C语言编写以来已经很长时间了,但是如果我正确地阅读了这个,那么你将打开一个文本文件,分离一个子进程(它将并行运行,或多或少),同时具有这两个进程独立地和异步地写入该文件,然后退出。

这两个过程很可能是逐个字符地相互写入的。

您有几个选择:

  1. 重新思考你的逻辑并让每个进程写入自己的文件
  2. 使用文件锁;让每个进程打开文件进行独占写入(不是一个好主意)
  3. 在代码中使用锁,以便子进程被迫等到父进程完成编写(再次,不是一个好主意。)
相关问题