我目前正在学习IPC,我有第一个项目
A:替B做个主管,然后等着
B:通过fifo接收来自第三个程序"C“的字符串,并将其重新发送给A。
我想在执委会之前在A中打开一个管道,然后把fd1传递给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在管道上写入字符串并在A中包含这样的内容时,我正在考虑将一个SIGUSR1发送到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);
}
然而,我得到的是“错误阅读连:成功”,有什么问题吗?
对不起,如果我的英语不好,任何帮助都是感谢的,谢谢!
发布于 2012-07-18 14:16:25
写入字符串的程序很可能是分段错误,因为这一行:
if(write(fd,&string,len)==-1) { /* ... */
因为你应该传递string
,,,,&
。
另一方面,您的错误消息并不能提供很好的信息,因为read()
可能返回0或小于sizeof(int)
字节。只有当返回值为errno
时,它才会设置-1
。read()
返回0或小于预期的事实通常意味着文件条件的结束,即另一端关闭了管道。
在进一步挖掘之前,你应该先解决这些问题。
发布于 2012-07-18 22:23:10
我自己回答是因为我已经解决了自己的问题:
我在fd1 ()之前关闭了fd1,这将导致fd1关闭(导致读取错误!)正如乙醇(C2H5OH;)所说。
我接受他的回答是因为它把我带到了解决方案!
https://stackoverflow.com/questions/11543024
复制相似问题