-1

我正在编写 C 程序,它不断生成两个名为stateNameand的字符串值timer(以每秒五次的速率)。我需要将它们连接起来并将它们传递给另一个名为的进程ProcessNo3_TEST,该进程负责标记并显示它们。

问题是我不知道如何通过execl. 我进行了几次尝试,但都没有成功。这是我的代码,它适用于一对值(例如UP298):

#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,"\0");
    return s3;
}

有人可以帮忙吗?

(顺便说一下,我在 Windows 上运行 CygWin)

- - - - - 更新 - - - - - - -

正如下面评论中所建议的,我找到了一个很好的例子fdopen()来解决我的问题。(链接

4

2 回答 2

0

如果设置为使用 execl() (通常人们不喜欢,但有时它有它的好处),那么您应该使用命名管道而不是匿名管道。execl() 后匿名管道结束丢失。但是如果你有一个命名管道,你可以将它的名字作为参数传递给 execl(),在子进程中打开它并在那里使用。

于 2015-10-09T16:13:05.770 回答
0

尽管可以安排将一个管道端的文件描述符编号(以字符串形式)作为程序参数传递,但通常会重定向子进程的标准流以从(在这种情况下)读取或写入管道。这通常是通过 实现dup2()的,您可以在分叉之后但之前在子进程中应用它execl()

然后父进程和子进程通过管道进行通信。在这种情况下,父级写入写入端,子级从读取端读取。任何一个或两者都可以通过将其文件描述符传递给fdopen(). 然后你可以使用它的 stdio 函数。还要注意,在分叉之后,每个进程都应该关闭它不打算使用的管道端的 FD。

于 2015-10-09T15:29:29.413 回答