【发布时间】:2026-01-09 10:10:01
【问题描述】:
我正在尝试通过根据发送的第一个字符串将多个内容打印到同一个文件来练习我的套接字编程。我发现我的 char 指针在运行后一直无效,因此不再存储第一次发送的名称。这是怎么回事?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
char* doprocessing (char *fnptr) {
fnptr = "filename.txt";
return fnptr;
}
int main( int argc, char *argv[] ) {
int sockfd, newsockfd, portno, clilen;
struct sockaddr_in serv_addr, cli_addr;
int count=0, pid;
char *fnptr = NULL;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
exit(1);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 5001;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
exit(1);
}
listen(sockfd,5);
clilen = sizeof(cli_addr);
while(1){
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
perror("ERROR on accept");
exit(1);
}
pid = fork();
if (pid < 0) {
perror("ERROR on fork");
exit(1);
}
if (pid == 0) {
close(sockfd);
printf("Pid is 0\n");
fnptr = doprocessing(fnptr);
printf("Fnptr is %s\n", fnptr);
exit(0);
}
else {
printf("Fnptr in else is %s\n", fnptr);
close(newsockfd);
}
printf("fnptr outside of else is %s\n", fnptr);
}
}
输出
Fnptr in else is (null) //Expected
fnptr outside of else is (null) //Expected
Pid is 0 //Start of processing
Fnptr is filename.txt //Goal
Fnptr in else is (null) //Where'd it go?
fnptr outside of else is (null) //Not good :(
【问题讨论】:
-
你知道
fork创建了一个新进程,进程有自己的地址空间吗? (=他们自己的记忆副本) -
TIL。所以每次进程分叉时,变量就被冒犯了?有什么方法可以跟踪它吗?
-
不,分叉的进程有自己的内存。在您的
if(pid == 0)分支中分配给fnptr对父进程绝对没有影响,因此它仍然为空。您需要使用某种进程间通信(这里最简单的是pipe) -
有一种方法叫做共享内存或进程间通信(IPC)。在 Google 上阅读更多关于它们的信息。您还可以使用管道在进程间进行通信。但是,我的猜测是您实际上并不想使用一个新的整个进程来处理该请求,而是一个新的线程。这样,您的
fnptr将自然在两个实体之间共享。 -
现在“poofed”是一个政治正确的词吗?
标签: c sockets while-loop fork