Re: Help on pipe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 10 Jul 2009 08:22:54 +0200, Ardhan Madras <nightdecoder@xxxxxxxxx> wrote:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
  pid_t pid;
  int fds[2], ret;
  const char *sort = "/usr/bin/sort";

"static const char sort[]" would be better IMO.

  char *argv[2] = { "sort", NULL };

"static const char *argv[]" is definitly better here and does not produce warnings. Your code discards "const" from pointer (a string literal).

  ret = pipe(fds);
  if (ret == -1) {
    perror("pipe");
    return -1;
  }
  pid = fork();
  if (pid == -1) {
    perror("fork");
    return -1;
  }

Personally I preffer something like:

  switch (fork()) {
  case -1: /* error */  break;
  case  0: /* child */  break;
  default: /* parent */
  }

but suit yourself.

  if (pid == 0) {
    int ret;

No need to define this variable here.  You already have such variable.


    close(fds[1]);
    dup2(fds[0], STDIN_FILENO);

    ret = execve(sort, argv, NULL);
    if (ret == -1) {
      perror("execve");
    }
    close(fds[0]);
    _exit(0);

No need to close(), and _exit(0) should be _exit(1) (or -1 if you will) since the chiled finished with error.

  }
  else {
    FILE *stream;

    close(fds[0]);
    stream = fdopen(fds[1], "w");
    if (!stream) {
      perror("fdopen");
      return -1;
    }
    fprintf(stream, "this\n");
    fprintf(stream, "means\n");
    fprintf(stream, "war\n");
    fflush(stream);

And here, replace fflush() with fclose(). It seems, data is buffered on kernel level, not only libc level and fflush() cannot handle that.

    waitpid(pid, &ret, 0);
    close(fds[1]);

No need to close.

  }
  return 0;
}

--
Best regards,                                            _     _
 .o. | Liege of Serenly Enlightened Majesty of         o' \,=./ `o
 ..o | Computer Science,  Michał "mina86" Nazarewicz      (o o)
 ooo +-<m.nazarewicz@xxxxxxxxxxx>-<mina86@xxxxxxxxxx>-ooO--(_)--Ooo--

--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux