使用 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