使用 fork 函数的问题 linux
Problems using the fork function linux
我正在努力实现以下目标:我从输入文本文件中读取了 nr 个单词,对于每个单词,我想启动一个子进程来修改单词和 return 它在输出文本文件中。输出波动,有时我把单词弄乱(apple bananale 变成 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;
}
您的每个子进程都在写入同一个输出流,并且它们都是 运行 同时发生的,因此它们的输出混合在一起。
与其一次写一个字符,不如写整行。调用 write()
到符合 POSIX 的本地文件系统是原子的,因此您不会在每个进程之间混合数据。
所以改变循环:
for (l=0;l<j;l++)
write (out, v+l, 1);
到
write(out, v, j);
有关此的各种注意事项,请参阅 Atomicity of `write(2)` to a local filesystem。
我正在努力实现以下目标:我从输入文本文件中读取了 nr 个单词,对于每个单词,我想启动一个子进程来修改单词和 return 它在输出文本文件中。输出波动,有时我把单词弄乱(apple bananale 变成 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;
}
您的每个子进程都在写入同一个输出流,并且它们都是 运行 同时发生的,因此它们的输出混合在一起。
与其一次写一个字符,不如写整行。调用 write()
到符合 POSIX 的本地文件系统是原子的,因此您不会在每个进程之间混合数据。
所以改变循环:
for (l=0;l<j;l++)
write (out, v+l, 1);
到
write(out, v, j);
有关此的各种注意事项,请参阅 Atomicity of `write(2)` to a local filesystem。