首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >工控机用管

工控机用管
EN

Stack Overflow用户
提问于 2012-07-18 13:52:57
回答 2查看 416关注 0票数 1

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

A:替B做个主管,然后等着

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

我想在执委会之前在A中打开一个管道,然后把fd1传递给B作为论据

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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在管道上写入字符串并在A中包含这样的内容时,我正在考虑将一个SIGUSR1发送到A:

代码语言:javascript
运行
复制
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);
}

然而,我得到的是“错误阅读连:成功”,有什么问题吗?

对不起,如果我的英语不好,任何帮助都是感谢的,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-18 14:16:25

写入字符串的程序很可能是分段错误,因为这一行:

代码语言:javascript
运行
复制
if(write(fd,&string,len)==-1) { /* ... */

因为你应该传递string,,&

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

在进一步挖掘之前,你应该先解决这些问题。

票数 1
EN

Stack Overflow用户

发布于 2012-07-18 22:23:10

我自己回答是因为我已经解决了自己的问题:

我在fd1 ()之前关闭了fd1,这将导致fd1关闭(导致读取错误!)正如乙醇(C2H5OH;)所说。

我接受他的回答是因为它把我带到了解决方案!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11543024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档