• 0

[C] Using pipe


Question

I am writing a simple shell-like program. I'm stuck on writing the pipeline part. (IE: program_A | program_B )

I'm assuming I need to use pipe(), but I'm unsure how to do this exactly.

program_A reads from stdin, then it write to a pipe? The other end of this pipe is read in by program_B (but program_B normally reads from stdin, so how do I redirect it without messing up program_A?). program_B then outputs to stdout.

Do I setup the pipe, let program_A run and output to the pipe, then start program_B (after redirecting stdin to the pipe)?

Thanks!

Link to comment
https://www.neowin.net/forum/topic/845358-c-using-pipe/
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Well,there are the dup functions that duplicates a file descriptor. Your program A should look something like this:

#include <unistd.h>
#include <errno.h>
#include <stdio.h>

//all other includes

int main(void)
{
		int mypipe[2];
		char message[255];

		if(pipe(mypipe) == -1)
		{
				   perror("\nCould not pipe");
				   return 0;
		 }
		 //now the fork part,we redirect the output after we use fork
		 //since the child process is an exact copy of the parent,it will have the same pipe
		 //so we can use that communicate between the processes
		 if(fork() != 0)
		 {
					//it means that this part of if will only execute in the original process,the "parent"
					//because the fork function has different outputs in the processes
					//in the parent,it returns the child's pid which is different from 0
										//in the child it returns 0
					//1 is the default descriptor for stdout so we close this descriptor
					//so that we  can use the "free" slot to add our own output,in our case
					//the write end of the pipe,meaning mypipe[1]
					printf("\nPlease enter message");
					close(1);
					if(dup2(mypipe[1],1) == -1)
					{
							   perrror("\nCould not set stdout);
							   return 0;
					}
					//now we are ready to read from the keyboard 
					//and when it outputs something,it will output it to the write end of the pipe
					//instead of stdout
					scanf("%s",mesage);
					printf("%s",message);
					//the output will be read by the other process,or any other processes that it will start
		 }
		 else
		 {
				   close(0);
				   //we close the standard input so we can replace it with our pipe's read end
				   if(dup(mypipe[0],0) == -1)
				   {
							   perror("\nCould not duplicate descriptor");
							   return 0;
				   }
				   //now we are ready to use any of the exec commands to replace the current process with another one
				   //the new process will inherit the descriptors,so when we read anything in it
				   //it will read what the other process outputs
				   if(execlp("program_B","program_B",NULL) == -1)
				   {
							perror("\nCould not execute program");
							return 0;
				   }
		 }
		 return 0;

}

Hope that answers at least some of your questions. Be carefull though,that the program might hang if it doesn't receive any input from the other process so you need to be carefull about that. And in my case,if one of the dup's fail,the other process will still remain active.

Edited by Cold Blood
Link to comment
https://www.neowin.net/forum/topic/845358-c-using-pipe/#findComment-591844958
Share on other sites

  • 0

That was useful. So, I've gotten it so that a single pipeline will work. Now I have to get it so any number will work (prog_A | prog_B | prog_C etc).

I just need to figure out how to write the for loop. I think I should setup program_A outside, then enter a loop which pipes and starts the next programs until each is started. I'll post so code once I figure it out in case someone else in the world needs help.

Link to comment
https://www.neowin.net/forum/topic/845358-c-using-pipe/#findComment-591846678
Share on other sites

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Wow, imagine you dump hundreds of hours into completing things and unlocking stuff and you lose it all. Back in the day when cheats were built into games, you could at least unlock things again that way without spending hundreds of hours again. But those days are long gone for some reason as no one builds cheats into games anymore. So it's even more painful that studio that's on its 6th installment **** it up so badly.
    • Spotify finally removes the disco ball app icon in the latest update by Ivan Jenic Image: Spotify Spotify has just released an update that removes its now infamous disco ball icon. The update reverts the app icon to the familiar flat green logo after weeks of mixed reactions online. The icon arrived on May 13 as part of the company's 20th anniversary celebration and was always intended to be temporary, though Spotify only confirmed that after the backlash started. The disco ball took the internet by storm, as the reception was split. A vocal group of users called it ugly and disorienting, with some iOS users noting that the 3D glowing effect made the app look like it was stuck mid-update. On the other end, the icon picked up a following of its own. Its retro, three-dimensional look immediately stood out against the flat, minimalist aesthetic that has dominated app design for years. It even started a small movement, spawning what people started calling "discomorphism," a mashup of disco and skeuomorphism. Other brands started posting disco ball versions of their own logos, probably in an effort to ride the wave of memes that flooded the internet during late May. Spotify has had a turbulent relationship with its user base lately. Besides the disco ball icon, which certainly wasn't appreciated by everyone, the company has also received backlash for its willingness to include AI-generated music on its platform. On May 17, Spotify promised the old icon would return “in a few weeks.” And now it looks like that time has finally arrived. So, whether you liked the disco ball or it made you uncomfortable, it’s now gone for good. The next time you update the Spotify app on your phone, the old, flat-design icon will return.
  • Recent Achievements

    • One Year In
      slackerzz earned a badge
      One Year In
    • One Year In
      highriskpaym earned a badge
      One Year In
    • One Month Later
      highriskpaym earned a badge
      One Month Later
    • Week One Done
      highriskpaym earned a badge
      Week One Done
    • Week One Done
      FBSPL earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      519
    2. 2
      PsYcHoKiLLa
      197
    3. 3
      +Edouard
      157
    4. 4
      Steven P.
      84
    5. 5
      ATLien_0
      75
  • Tell a friend

    Love Neowin? Tell a friend!