我尝试获取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。
编辑:我做了这个,但没有工作^^答案 0 :(得分:1)
fd
在这里,您取消引用指针fd
,但是您从未将值赋给fd
,因此其内容是不确定的。尝试取消引用未初始化的指针会导致未定义的行为。
你真的不需要指针。只需将int
声明为int fd;
...
fd = pipe_fds[0];
并直接指定即可。
read
执行此操作后,您可以使用fd
从using 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;
}