在不同程序之间使用管道如何?

时间:2013-11-25 21:48:09

标签: c linux

问题再次提出并修改了代码......

我需要在linux中创建三个名为program0 program1和program2的程序。

Program0:创建一个包含两个子进程的父进程,并执行程序1和程序2,其子进程等待它们完成并关闭。

Program1:从用户获取文件名并将文本写入文件。当按下CTNL + D并创建管道时完成写入。之后使用cat命令将文件写入stdout并使用dup()创建有文件的管道。

Program2:它在dup()的帮助下从管道中读取文件名,然后执行wc命令。

到目前为止,我设法创建所有程序,我没有编译错误。程序0执行两个程序。程序1也工作并将文件发送到管道但program2无法从管道中读取它打印奇怪的符号..

当我尝试从program1中的管道读取时,它可以工作(参见program1中的去激活代码),但如果我将它放在program2中,相同的代码就不起作用。

那么我怎样才能让program2从管道中读取,之后我会尝试在program2中执行wc命令,但首先我应该能够看到它从stdout中获取文件的输入如何?

我知道它有点长,但请帮助我们......

计划0

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#define MAX 999

int main()
{
pid_t pid1, pid2;

pid1 = fork();
if(pid1<0) 
{
fprintf(stderr,"Fork basarisiz");
exit(-1);
}
else if (pid1 ==0)/*child prosesleri*/
{


printf("program1\n");

execlp("./program1","program1",NULL);
execlp("./program2","program2",NULL);
}
else /*parent procsesleri */
{
wait(NULL);
pid2 = fork();
if(pid2<0) 
{
fprintf(stderr,"Fork basarisiz");
exit(-1);
}
else if (pid2 ==0)/*child prosesleri*/
{
printf("\n");
printf("Program 2\n");
printf("\n");
execlp("./program2","program2",NULL);
//printf("\n");
}
else
{
}

/////////////////////////////////////////////////////////////////////////
wait(NULL);
printf("\n");
printf("Parent:Two child processes have successfully been created\n");
printf("Parent:Two child processes have successfully been terminated\n");
printf("Parent:This process will now terminate\n");
printf("\n");
exit(0);
}
}

计划1

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define MAX 999

int main() 
{ 
    char c[10000];              
    char file[10000];
    int words;
    printf("Child1:A text file will be created\n");
    printf("Child1:Enter the name of the file\n");
    scanf("%123s",file);
    strcat(file,".txt"); 
    FILE * pf; 
    pf = fopen(file, "w" );

   if (!pf)
   fprintf( stderr, "I couldn't open the file.\n" );

   else
   {
        printf("Child1: Input a number of text lines ended, each ended by a CR (carriage return).\n");


/////////////////////////////

  do
{
  if (NULL != fgets(c, sizeof(c), stdin))
  {
    if (0 == strcmp(c, ".\n")) 
    {
      break;
    }

    fprintf(pf, "%s", c);
  }
  else
  {
    if (0 != ferror(stdin))
    {
      fprintf(stderr, "An error occured while reading from stdin\n");
    }
    else
    {
      printf("Child1: Finish the input by CNTL^D\n");
    }

    break;
  }
} while (1);

/////////////////////////////

    }
    printf("\nChild1:The file %s is succesfully created and saved in the current dictionary\n",file);


//////////////////////////////////////////////



/////////////////////////pipe///////////////

    fclose(pf);  // close file  

        char ch;
        int outcount = 0;
        int     fd[2], nbytes;
        pid_t   childpid;
int i;
        char f2[2];

        char    readbuffer[80];

        pipe(fd);

        if((childpid = fork()) == -1)
        {
                perror("fork");
                exit(1);
        }

        if(childpid == 0)

        {       printf("\nChild1:The file written to pipe with cat\n");
                close(1) ;
                dup(fd[1]);
                close(fd[0]);
                execlp("/bin/cat", "cat", file,NULL);

        }
        else
        {
            wait(NULL);  
            //close(0) ; 
            //dup(fd[0]) ;
            //close(fd[1]);
            //nbytes = read(fd[0], readbuffer, sizeof(readbuffer));

            //printf("%s\n",readbuffer);
        }

        return(0);
} 

计划2

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

int main() 
{ 
        int   fd[2],nbytes;
        pid_t   childpid;
        char    readbuffer[80];

        pipe(fd);

        if((childpid = fork()) == -1)
        {
                perror("fork");
                exit(1);
        }

        if(childpid == 0)
        {
        }
        else
        {
            close(0) ; 
            dup(fd[0]) ;
            close(fd[1]);
            nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
            printf("%s\n",readbuffer);

        }

        return(0);
}

1 个答案:

答案 0 :(得分:1)

您可能需要查看 execve(2)(用于启动cat)和 dup2(2)的手册页(用于覆盖{{1对于这个,我需要{}和stdinstdout将用另一个(相同的PID,相同的文件描述符)覆盖当前正在执行的程序,而execve将允许您重新定义任何标准文件描述符以指向您提供的任何文件描述符它(如管道的任何一端)。