c - linux使用fork函数的问题

标签 c linux process fork

我正在尝试实现以下目标:我从输入文本文件中读取了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/

相关文章:

php - Linux 使 PHP 从源代码到 '.so' 文件

android - adb 安装失败,出现错误 'INSTALL_FAILED_INSUFFICIENT_STORAGE'

linux - 如何让 tail 在跟踪文件之前等待创建文件

c# - 从 C# 代码安装 npm 失败

仅当存在打印时代码才能正确执行 (C)

C - 将 time_t 转换为格式为 YYYY-MM-DD HH :MM:SS 的字符串

在单个函数原型(prototype)中将包含单词和数字的文本文件调用到数组中

c - C 中的内存访问冲突 : Trying to write substrings from char** to char**

c# - 使用 C# 获取打开进程 Windows 文本框

c - 从 parent 向 child 发送信号,反之亦然