gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:23:57 25 4
gpt4 key购买 nike

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

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

我应该做什么?

最佳答案

自从我用 C 编写代码以来已经很长一段时间了,但是如果我正确地理解了这一点,您将打开一个文本文件, fork 出一个子进程(或多或少将并行运行),同时拥有两个进程独立且异步写入该文件,然后退出。

很可能这两个进程正在逐个字符地相互写入。

您有几个选择:

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

关于c - fprintf 和 printf 输出顺序在控制台和文件之间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12410625/

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