johns4ta
johns4ta

Reputation: 896

Sending C Command Line Arguments Through Pipe

I am trying to send my command line arguments through from the child process to the parent process using a pipe but can't figure out what I'm doing wrong. My code is below. Any help is appreciated. Thanks in advance.

int main(int argc, char argv[])
   pid_t child;
   int fd[2];

   pipe(fd);
   if((child = fork() == 0)
   {
      int len = strlen(argv[1]);
      close(fd[0];
      write(fd[1], argv[1], len);
      exit(0);
   }
   else //Assuming process won't fail for now
   {
      char src[10]; //Just using 10 for now, no arguments have more than 10 characters
      read(fd[0], src, (strlen(src)));
      fprintf(stderr, "%s\n", src);
      close(fd[0]);
   }
}

Upvotes: 1

Views: 3340

Answers (3)

Duck
Duck

Reputation: 27542

You had a bunch of little errors but as far as I can see, believe it or not, this may be your real problem.

read(fd[0], src, (strlen(src)));

My guess is that the first char is null and you are successfully reading 0 bytes.

Change to

  read(fd[0], src, (sizeof(src)));

In your larger project make sure you read and write in loops. You are not guaranteed to read or write what you specify.

Upvotes: 2

Dhaval
Dhaval

Reputation: 1076

You have assumed that fork() will not fail.

But what about pipe()??

Assume both get completed successfully, then closing fds properly is requered.

your if-else blocks should be like this.

if((child = fork() == 0)
   {
      int len = strlen(argv[1]);
      close(fd[0]);//I assume this was your typo. otherwise it would not even get compiled
      write(fd[1], argv[1], len);
      close(fd[1]);
      exit(0);
   }
else //Assuming process won't fail for now
   {
      close(fd[1]);
      char src[10]; //Just using 10 for now, no arguments have more than 10 characters
      read(fd[0], src, (strlen(src)));
      fprintf(stderr, "%s\n", src);
      close(fd[0]);
   }

Upvotes: 0

CS Pei
CS Pei

Reputation: 11047

You may need to close fd[1] inside the else block first.

check this example

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
    int
    main(int argc, char *argv[])
    {
            int pipefd[2];
            pid_t cpid;
            char buf;
            if (argc != 2) {
            fprintf(stderr, "Usage: %s <string>\n", argv[0]);
            exit(EXIT_FAILURE);
            }
            if (pipe(pipefd) == -1) {
                    perror("pipe");
                    exit(EXIT_FAILURE);
            }
            cpid = fork();
            if (cpid == -1) {
                    perror("fork");
                    exit(EXIT_FAILURE);
            }
            if (cpid == 0) {    /* Child reads from pipe */
                    close(pipefd[1]);          /* Close unused write end */
                    while (read(pipefd[0], &buf, 1) > 0)
                            write(STDOUT_FILENO, &buf, 1);
                    write(STDOUT_FILENO, "\n", 1);
                    close(pipefd[0]);
                    _exit(EXIT_SUCCESS);
            } else {            /* Parent writes argv[1] to pipe */
                    close(pipefd[0]);          /* Close unused read end */
                    write(pipefd[1], argv[1], strlen(argv[1]));
                    close(pipefd[1]);          /* Reader will see EOF */
                    wait(NULL);                /* Wait for child */
                    exit(EXIT_SUCCESS);
            }
    }

Upvotes: 1

Related Questions