1

我目前正在学习IPC,我有第一个程序

A:为 B 执行 exec 并等待

B:通过fifo接收来自第三个程序“C”的字符串,并且必须将其重新发送给A

我想在执行之前在 A 中打开一个管道,然后将 fd[1] 作为参数传递给 B

if(pipe(fd)==-1){
    perror("Pipe Failed");
    myExit(EXIT_FAILURE);
}

close(fd[1]);   
sprintf(fdString,"%d",fd[1]);

    .......

if((int)(pid=fork())>0)

    waiting(status);    

else if(pid==0){    

    close(fd[0]);   

    execl("./B","B",fdString,(char*)0);
    perror("Exec failed");
    myExit(EXIT_FAILURE);

}

然后在 B 中:

int fd=atoi(argv[1]);

    //Receive string from C 

    len=strlen(string)+1;

if(write(fd,&len,sizeof(int))==-1){
    perror("Error on writing length");
    exit(EXIT_FAILURE); 
}

if(write(fd,string,len)==-1){
    perror("Error on writing string");
    exit(EXIT_FAILURE);     
}

我现在的问题是在 A 中读取此字符串。我正在考虑将 SIGUSR1 发送到 A,只要字符串由 B 在管道上写入并在 A 中具有类似的内容:

signal(SIGUSR1, signalHandler);
    ........
    static void signalHandler(int signo){
    switch(signo){
    case SIGUSR1:
        listen();
        break;
    default: break;

    }
}
    ........
static void listen(){

    int len;

    if(read(fd[0],&len,sizeof(int))<sizeof(int)){
        perror("Error reading len");
        myExit(EXIT_FAILURE);   
    }

    char string[len];

    if(read(fd[0],&string,len)<len){
        perror("Error reading string");
        myExit(EXIT_FAILURE);   
    }
    printf("String: %s with length %d\n", string, len);
}

但是我得到的是 "Error reading len: Success",怎么了?

对不起,如果我的英语不好,任何帮助表示赞赏,谢谢!

4

2 回答 2

1

由于这一行,写入字符串的程序很可能出现段错误

if(write(fd,&string,len)==-1) { /* ... */

正如你应该通过string 没有&.

另一方面,您的错误消息信息量不大,因为read()可能返回 0 或小于sizeof(int)字节。errno只有当返回值为 时才会设置-1read()返回 0 或小于预期的事实通常意味着文件结束条件,即另一端已关闭管道。

在尝试进一步挖掘之前,您应该解决这些问题。

于 2012-07-18T14:16:25.530 回答
0

我自己回答,因为我实际上已经解决了我自己的问题:

我在 fork() 之前关闭了 fd[1],这将导致 fd[1] 关闭的孩子(导致读取错误!)正如 Ethanol (C2H5OH ;)) 所说。

我接受了他的回答,因为它让我找到了解决方案!

于 2012-07-18T22:23:10.250 回答