我尝试使用守护进程和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