You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中通过管道调用gzip生成压缩文件权限异常排查

问题原因与修复方案

核心权限问题

你创建trovetest.gz文件时调用open函数缺少权限参数。当使用O_CREAT标志时,open必须传入第三个参数指定文件的初始权限(如0644),否则会读取栈上的随机值作为权限,导致生成的文件出现无读写权限的异常。

修复代码

修改子进程中open的调用:

int fd1 = open("trovetest.gz", O_WRONLY | O_CREAT, 0644);

这里0644表示文件所有者可读可写,组用户和其他用户仅可读,是常规文件的合理权限配置。

额外潜在问题修复

除权限问题外,代码还有两处需要优化的点:

  • 父进程文件读取不完整:当前代码仅读取一次1024字节的内容,若源文件超过该大小,压缩后的文件会被截断。需循环读取直到文件结束:
    char buf[1024];
    size_t nbytes;
    while ((nbytes = fread(buf, 1, sizeof(buf), fdin)) > 0) {
        write(pipe1[1], buf, nbytes);
    }
    
  • execl参数不规范:execl的第二个参数应为程序的argv[0](通常是简化的程序名而非全路径),规范写法如下:
    execl("/usr/bin/gzip", "gzip", (char*)NULL);
    

修复后的子进程代码片段

// child process
else if (childpid == 0){
    close(pipe1[1]);
    dup2(pipe1[0], STDIN_FILENO);
    close(pipe1[0]);
    // 添加权限参数并增加错误检查
    int fd1 = open("trovetest.gz", O_WRONLY | O_CREAT, 0644);
    if (fd1 == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    dup2(fd1, STDOUT_FILENO);
    close(fd1);
    // 规范execl参数
    int i = execl("/usr/bin/gzip", "gzip", (char*)NULL);
    if (i<0) {
        perror("execl");
    }
    perror("/usr/bin/gzip");
    exit(EXIT_FAILURE);
}

内容的提问来源于stack exchange,提问作者romeo_yenni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:26:28