如何通过EXCEL将连续的数据流从一个进程发送到另一个进程
How to send continuous stream of data from one process to another via EXECL
我正在编写 C 程序,它不断生成名为 stateName
和 timer
的两个字符串值(以每秒五次的速率)。我需要将它们连接起来并传递给另一个名为 ProcessNo3_TEST
的进程,该进程负责标记化并显示它们。
问题是我不知道如何通过execl
连续传递它们。我进行了几次尝试,但 none 次都成功了。这是我的代码,它适用于一对值(例如 UP2
和 98
):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define READ 0
#define WRITE 1
int FIFO[2];
char fileDescriptor[10];
char* stringMaker( char *s1,char *s2 );
int main()
{
char lengthInChar[15],msg[200];
int msgLength,i;
char *stateName, *timer;
if (pipe(FIFO) == -1)
{
printf("cannot create pipe\n");
exit(1);
}
sprintf(fileDescriptor, "%d", FIFO[READ]);
stateName = "UP2"; // for instance
timer = "98"; // for instance
msgLength = strlen(stateName) + strlen(timer) +3;
strcpy(msg, stringMaker(stateName, timer) );
write(FIFO[WRITE], msg, msgLength);
switch (fork())
{
case 0:
sprintf(lengthInChar, "%d", msgLength);
execl("ProcessNo3_TEST", "ProcessNo3_TEST", lengthInChar, fileDescriptor, NULL);
exit(1);
case -1:
perror("fork() failed-->");
exit(2);
default:
break;
}
sleep(10);
exit(0);
}
char* stringMaker( char *s1,char *s2 )
{
char *s3;
strcpy(s3,s1);
strcat(s3,"-");
strcat(s3,s2);
strcat(s3,"-");
strcat(s3,"[=10=]");
return s3;
}
有人可以帮忙吗?
(顺便说一句,我在 Windows 上是 运行 CygWin)
------------更新-------------
正如下面评论中所建议的,我找到了 fdopen()
的一个很好的例子,它解决了我的问题。 (Link)
虽然 可以 安排将一个管道端的文件描述符编号(以字符串形式)作为程序参数传递,但通常会改为重定向 child 进程的标准要从中读取(在本例中)或写入管道的流。这通常是通过 dup2()
实现的,您可以在 child 过程中应用它,在分叉之后但在 execl()
.
之前
Parent 和 child 进程然后通过管道进行通信。在这种情况下,parent 写入写入端,child 从读取端读取。两者之一或两者都可以通过将文件描述符传递给 fdopen()
来将其文件描述符包装在流中。然后你可以使用 stdio 函数。还要注意,在 fork 之后,每个进程都应该关闭它不打算使用的管道端的 FD。
如果设置为使用 execl()(通常人们不喜欢,但有时它有好处),那么您应该使用命名管道而不是匿名管道。匿名管道端在 execl() 之后丢失。但是如果你有一个命名管道,你可以将它的名称作为参数传递给 execl(),在子进程中打开它并在那里使用。
我正在编写 C 程序,它不断生成名为 stateName
和 timer
的两个字符串值(以每秒五次的速率)。我需要将它们连接起来并传递给另一个名为 ProcessNo3_TEST
的进程,该进程负责标记化并显示它们。
问题是我不知道如何通过execl
连续传递它们。我进行了几次尝试,但 none 次都成功了。这是我的代码,它适用于一对值(例如 UP2
和 98
):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define READ 0
#define WRITE 1
int FIFO[2];
char fileDescriptor[10];
char* stringMaker( char *s1,char *s2 );
int main()
{
char lengthInChar[15],msg[200];
int msgLength,i;
char *stateName, *timer;
if (pipe(FIFO) == -1)
{
printf("cannot create pipe\n");
exit(1);
}
sprintf(fileDescriptor, "%d", FIFO[READ]);
stateName = "UP2"; // for instance
timer = "98"; // for instance
msgLength = strlen(stateName) + strlen(timer) +3;
strcpy(msg, stringMaker(stateName, timer) );
write(FIFO[WRITE], msg, msgLength);
switch (fork())
{
case 0:
sprintf(lengthInChar, "%d", msgLength);
execl("ProcessNo3_TEST", "ProcessNo3_TEST", lengthInChar, fileDescriptor, NULL);
exit(1);
case -1:
perror("fork() failed-->");
exit(2);
default:
break;
}
sleep(10);
exit(0);
}
char* stringMaker( char *s1,char *s2 )
{
char *s3;
strcpy(s3,s1);
strcat(s3,"-");
strcat(s3,s2);
strcat(s3,"-");
strcat(s3,"[=10=]");
return s3;
}
有人可以帮忙吗?
(顺便说一句,我在 Windows 上是 运行 CygWin)
------------更新-------------
正如下面评论中所建议的,我找到了 fdopen()
的一个很好的例子,它解决了我的问题。 (Link)
虽然 可以 安排将一个管道端的文件描述符编号(以字符串形式)作为程序参数传递,但通常会改为重定向 child 进程的标准要从中读取(在本例中)或写入管道的流。这通常是通过 dup2()
实现的,您可以在 child 过程中应用它,在分叉之后但在 execl()
.
Parent 和 child 进程然后通过管道进行通信。在这种情况下,parent 写入写入端,child 从读取端读取。两者之一或两者都可以通过将文件描述符传递给 fdopen()
来将其文件描述符包装在流中。然后你可以使用 stdio 函数。还要注意,在 fork 之后,每个进程都应该关闭它不打算使用的管道端的 FD。
如果设置为使用 execl()(通常人们不喜欢,但有时它有好处),那么您应该使用命名管道而不是匿名管道。匿名管道端在 execl() 之后丢失。但是如果你有一个命名管道,你可以将它的名称作为参数传递给 execl(),在子进程中打开它并在那里使用。