я пытаюсь сжать файл в своей программе, используя gzip. я fork() и в родительском я записываю исходный файл в канал. затем в дочернем процессе я использую execl() для использования gzip. файл gzip создается, он сжимается, однако по какой-то причине он создается без прав на чтение или запись код, который делает это:
int main (int argc, char **argv){
int pipe1[2];
pid_t childpid;
FILE *fdin;
if (argc != 2)
{
fprintf(stderr, "Usage: %s file\n", argv[0]);
exit(1);
}
pipe(pipe1);
// error handling
if ((childpid = fork()) == -1){
perror("fork");
exit(1);
}
// parent load file, write to pipe1
if (childpid != 0){
char buf[1024];
close(pipe1[0]);
fdin = fopen(argv[1], "r");
if (fdin == 0)
{
fprintf(stderr, "%s: failed to open file '%s'\n", argv[0], argv[1]);
exit(1);
}
int nbytes = fread(buf, 1, sizeof(buf), fdin);
if (nbytes <= 0)
{
fprintf(stderr, "%s: no data in file '%s'\n", argv[0], argv[1]);
exit(1);
}
fclose(fdin);
write(pipe1[1], buf, nbytes);
close(pipe1[1]);
}
// 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);
dup2(fd1, 1);
close(fd1);
int i = execl("/usr/bin/gzip","/usr/bin/gzip", (char*)NULL);
if (i<0) {
perror("execl");
}
perror("/usr/bin/gzip");
exit(EXIT_FAILURE);
}
// wait child
wait(NULL);
return 0;
}
есть идеи, что я делаю неправильно? Благодарю.





Когда вы открываете файл с помощью O_CREAT, вы также должны передать разрешения в качестве третьего аргумента. В противном случае используется некоторый мусор стека (в вашем случае, по-видимому, 0).
Текущий umask удаляется из этих разрешений, чтобы сделать фактические права доступа к файлам. Не беспокойтесь о umask, за исключением того, что обычно это 002 или 022, которые запрещают запись в файл группе (иногда) или всем).
Вы можете пройти, например. 0644 чтобы дать rw-r--r-- разрешения (доступно для чтения всем и для записи только владельцу):
int fd1 = open("trovetest.gz", O_WRONLY | O_CREAT, 0644);
// ^^^^