質問: -1) perror("open"); char buf[1024]; close(0); dup(fd[0]); memset(buf, '\0', sizeof(buf)); while(read(fd[0], buf, sizeof(buf))){ write(fp, buf, sizeof(buf)); memset(buf, 0, sizeof(buf)); } close(fp); wait(NULL); } return 0; } ```
回答: 最小限の変更を加えるとこんな感じで。 ``` #include #include #include #include #include #include #include int main(){ int fd[2]; pipe(fd); if(fork() == 0){ close(fd[0]); // 使わない側をクローズ close(1); dup(fd[1]); char *cmd[] = {"ls", "-a", "-l", NULL}; execvp(cmd[0], cmd); }else{ close(fd[1]); // 使わない側をクローズ int fp = open("test.txt", O_WRONLY | O_CREAT, 0644); // モード指定 if(fp == -1) perror("open"); char buf[1024]; close(0); // fd[0]から読むのならこのclose&dupは不要だが dup(fd[0]); int n; // readしたバイト数 while(n=read(fd[0], buf, sizeof(buf))){ write(fp, buf, n); } close(fp); wait(NULL); } return 0; } ```