获取execvp的输出并用管道打印

时间:2016-12-05 16:46:52

标签: c pipe exec mkfifo

我尝试获取execvp的输出并将其打印到命名管道。但是我怎么能这样做呢?这是我的代码:

    void *run(void *comm)
{
   struct command *com = (struct command *)comm;
   int fd[2];
   pipe(fd);

   if (fork() == 0)
   {
      close(fd[0]);

      dup2(fd[1], 1);
      dup2(fd[1], 2);
      close(fd[1]);

      execvp(com->list[0], com->list);
   }
   else
   {
      char buffer[1024] = {0};

      close(fd[1]);
      unlink(com->namePipe);
      if(mkfifo(com->namePipe, 0644) != 0)
      {
          fprintf(stderr, "Impossible de créer le tube nommé.\n");
          exit(EXIT_FAILURE);
      }
      if((fd[0] = open(com->namePipe, O_WRONLY)) == -1)
      {
          fprintf(stderr, "Impossible d'ouvrir l'entrée du tube nommé.\n");
          exit(EXIT_FAILURE);
      }
      while (read(fd[0], buffer, sizeof(buffer)) != 0)
      {
         write(1, buffer, strlen(buffer));
         memset (buffer, 0, sizeof(buffer));
      }
   }
    return NULL;

}

我不允许使用popen。

编辑:我做了这个,但没有工作^^

2 个答案:

答案 0 :(得分:1)

fd

在这里,您取消引用指针fd,但是您从未将值赋给fd,因此其内容是不确定的。尝试取消引用未初始化的指针会导致未定义的行为。

你真的不需要指针。只需将int声明为int fd; ... fd = pipe_fds[0]; 并直接指定即可。

read

执行此操作后,您可以使用fdusing System; using System.Threading.Tasks; using Twilio; using Twilio.Clients; using Twilio.Rest.Api.V2010.Account; using Twilio.Types; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { SendSms().Wait(); Console.Write("Press any key to continue."); Console.ReadKey(); } static async Task SendSms() { var accountSid = "ACba92b39902bc361138fea39fee0a41b7"; // Your Account SID from twilio.com/console var authToken = "{{ auth_token }}"; // Your Auth Token from twilio.com/console TwilioClient.init(accountSid, authToken); var restClient = new TwilioRestClient(accountSid, authToken); var message = await new MessageCreator( new PhoneNumber("+12345678901"), // To number accountSid, "Hello from C#" ).CreateAsync(restClient); Console.WriteLine(message.GetSid()); } } } 读取以获取该计划的输出。

答案 1 :(得分:0)

以下是如何获取命令输出的示例(使用execl):

#include <unistd.h>
#include <string.h>

int main()
{
   int fd[2];
   pipe(fd);

   if (fork() == 0)
   {
      close(fd[0]);

      dup2(fd[1], 1);
      dup2(fd[1], 2);
      close(fd[1]);

      execl("/bin/sh", "sh", "-c", "a_binary", (char *)NULL);
   }
   else
   {
      char buffer[1024] = {0};

      close(fd[1]);

      while (read(fd[0], buffer, sizeof(buffer)) != 0)
      {
         write(1, buffer, strlen(buffer));
         memset (buffer, 0, sizeof(buffer));
      }
   }
   return 0;
}
相关问题