我正在尝试实现以下目标:我从输入文本文件中读取了nr个单词,对于每个单词,我想启动一个子进程来修改该单词并将其返回到输出文本文件中。输出波动,有时我把单词弄乱了(苹果香蕉变成了appbananale),有时输出文件是20kb并且它卡住了文本编辑器。
int main(int argc, char **argv){
int in, out, i, nr, k, j;
char buffer[100];
in = open(argv[1], O_RDONLY);
if (in == -1){
perror(NULL);
return errno;
}
out = open(argv[2], O_WRONLY | O_CREAT, 0666);
if (out == -1){
perror(NULL);
return errno;
}
if (read(in, buffer, 100) == -1){
perror(NULL);
return errno;
}
nr = 5;
k=0;
srand(time(NULL));
char v[20];
int l;
j=0;
pid_t pid;
for (i=1;i<sizeof(buffer);i++){
if (k == nr) break;
if (buffer[i]=='\n'){
k++;
pid = fork();
if (pid < 0)
return errno;
if (pid == 0){
//for (l=0;l<j;l++)
write (out, v, j);
return 0;
}
j=0;
}
else{
j++;
v[j-1]=buffer[i];
}
}
return 0;
}
最佳答案
每个子进程都写入相同的输出流,并且它们都同时运行,因此它们的输出混合在一起。
不要一次写一个字符,而是写整行。对本地 POSIX 兼容文件系统的 write()
调用是原子的,因此您不会在每个进程之间混合数据。
所以改变循环:
for (l=0;l<j;l++)
write (out, v+l, 1);
至
write(out, v, j);
参见Atomicity of `write(2)` to a local filesystem有关于此的各种警告。
关于c - linux使用fork函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59505567/