为啥这个命名管道不打印发送的行?
Posted
技术标签:
【中文标题】为啥这个命名管道不打印发送的行?【英文标题】:Why is this named pipe not printing the sent line?为什么这个命名管道不打印发送的行? 【发布时间】:2010-11-30 03:43:10 【问题描述】:以下服务器在运行时会创建一个命名管道:
./serverprogram -p nameofthepipe -t 99
t 后面的 optarg 表示要创建的线程数(这里不做)。
无论如何,管道在这里不起作用:
/* Open the first named pipe for reading */
int rdfd = open(pipeName, O_RDONLY);
/* Read from the first pipe */
int numread = read(rdfd, command_and_pid, 280);
printf("what's being read is %s \n", command_and_pid); // not printing!!1!
为什么?
服务器程序:
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
int main (int argc, char * argv[])
char pipeName[30];
int numThreads;
char command_and_pid[280];
int opcion;
if (argc < 2)
printf ("ERROR: Missing arguments\n");//
exit(1);
opterr = 0;
while ((opcion = getopt (argc, argv, "p:t:w")) != -1)
switch (opcion)
case 'p': // -p indica el nombre del pipe
printf("The name of the pipe is: %s\n",optarg);
strcpy(pipeName, optarg);
break;
case 't'://-t indica los hilos
printf("The number of threads is: %s\n",optarg);
numThreads= atoi(optarg);
break;
case '?':
fprintf(stderr,"no reconozco esa opcion\n");
break;
int ret_val = mkfifo(pipeName, 0666);
if ((ret_val == -1) && (errno != EEXIST))
perror("Error creating the named pipe");
exit (0);
/* Open the first named pipe for reading */
int rdfd = open(pipeName, O_RDONLY);
/* Read from the first pipe */
int numread = read(rdfd, command_and_pid, 280);
printf("what's being read is %s \n", command_and_pid); // not printing!!1!
close(rdfd);
return 0;
客户端程序:
#include <unistd.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
int main (int argc, char * argv[])
char pipeName[30];
printf("write the name of the pipe used to write to the server \n");
fgets(pipeName,30, stdin);
/* Open the first named pipe for writing */
int wrfd = open(pipeName, O_WRONLY);
printf("write the name of the command you want to execute \n");
char command_and_pid[280];
char command[250];
fgets(command,250, stdin);
puts(command); //quitar
strcpy(command_and_pid,command);
strcat(command_and_pid," ");
int pipeIntId;
char pidstring [30];
int pid= getpid();
sprintf(pidstring,"%d", pid);
strcat(command_and_pid,pidstring);
int written;
written=write(pipeIntId,command_and_pid,280);
//write to the pipe
// send the command and pid
close(pipeIntId); // close write pipe
return 0;
【问题讨论】:
read()
是否返回? numread
的值是多少?
不是。我担心管道名称。我认为事情的两端都没有正确命名。
测试open()
和read()
的返回值。
是的,这是一个管道名称。我猜客户端 fgets 上的空格搞砸了。
【参考方案1】:
在客户端中,fgets
将换行符保留在行尾,因此您需要在打开文件之前删除它。
此外,在给定的代码中,您正在打开 wrfd
,但写入未初始化的 pipeIntId
(尽管您可能正在从此处的函数中提取某些内容)。
【讨论】:
是的,我也发现了。感谢您花时间查看代码。以上是关于为啥这个命名管道不打印发送的行?的主要内容,如果未能解决你的问题,请参考以下文章