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
相关产品推荐
相关产品推荐

