客户端写入fifo

时间:2016-03-30 05:34:22

标签: c server client daemon fifo

我尝试使用守护进程和fifo(命名管道)在C中实现服务器和客户端。我的客户端和服务器成功创建了彼此之间的连接。但是,服务器只进行第一次读取(即读取客户端的pid),然后自行终止。

首先,我运行服务器程序,然后使用命令 ps -xj | grep myserver 检查它是否成功创建了一个守护进程。在这一点上,一切看起来都很好。然后我调试客户端程序,并在每次写入客户端后使用命令 ps -xj | grep myserver 检查服务器的守护程序进程。我也会在每次写客户端后检查服务器的日志文件。

客户端连接到fifo后,我可以在服务器日志文件中看到 DAEMON STARTED 。然后我在每次写客户端后检查服务器的日志文件,在客户端完成所有写操作之前我都看不到任何内容。客户端再次完成所有写操作后,我检查服务器的日志文件,我只能看到客户端的pid,但我无法在其日志文件中看到服务器的其他读取结果。

例如,我希望如此    syslog(LOG_NOTICE, "Directory name: %s\n", dirName);dirName写入服务器的日志文件。在客户端完成所有写操作之后,我使用命令 ps -xj | grep myserver 检查服务器的守护进程,我看到该守护进程被终止。我无法找到服务器在客户端完成所有写操作后杀死守护进程的原因,并且在客户端首次写入后没有读取客户端的写操作。我将不胜感激任何帮助。谢谢!

这是我到目前为止编写的代码:

服务器

createDaemon(argv[1]);

umask(0);           
mkfifo(serverFifoPath, 0666)  
int serverFd = open(serverFifoPath, O_RDONLY);
int dummyFd = open(serverFifoPath, O_WRONLY);
signal(SIGPIPE, SIG_IGN)

for(;;)
{
    syslog(LOG_NOTICE, "DAEMON STARTED");

    //READ
    pid_t clientPID = 0;
    read(serverFd, &clientPID, sizeof(clientPID))

    int dirNameSize;
    read(serverFd, &dirNameSize, sizeof(dirNameSize))
    char *dirName = (char *)malloc(dirNameSize);
    read(serverFd, &dirName, dirNameSize)

    //Another integer and string read here
    syslog(LOG_NOTICE, "Pid: %d\n", clientPID);
    syslog(LOG_NOTICE, "Directory name: %s\n", dirName);

    int clientFd = open(clientFifo, O_WRONLY);
    //Server writes to fifo here
    close(clientFd);                
}

客户端:

mkfifo(clientFifo, 0666);
int serverFd = open(serverFifoPath, O_WRONLY);

write(serverFd, &clientPID, sizeof(clientPID));

write(serverFd, &dirNameSize, sizeof(dirNameSize));
write(serverFd, &(argv[1]), dirNameSize);
//Another integer and string write here

int clientFd = open(clientFifo, O_RDONLY);
unlink(clientFifo);

//Client reads here

我从此链接获得了createDaemon功能:Creating a Daemon in Linux

0 个答案:

没有答案