繁体   English   中英

使用管道进行IPC

[英]Using pipe for IPC

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

A:为B做高管,然后等待

B:通过fifo从第三个程序“ C”接收字符串,然后将其重新发送给A

我当时想在exec之前在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中读取此字符串。我在想一些事情,以便在B将字符串写入管道后立即将SIGUSR1发送给A,并在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);
}

但是我得到的是“错误读取len:成功” ,这是什么问题?

抱歉,如果我的英语不好,谢谢您的帮助,谢谢!

写入字符串的程序很可能因为这一行的要段错误

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

正如你应该通过string 内部消除&

另一方面,您的错误消息不是很有用,因为read()可能返回0或小于sizeof(int)字节。 仅在返回值为-1时设置errno read()返回的值小于或等于预期值0的事实通常表示文件条件结束 ,即另一端已关闭管道。

您应先解决这些问题,然后再尝试进一步研究。

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

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

我接受他的回答,因为这将我引向了解决方案!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM