我有一个简单的代码充当Web服务器(只接受来自URL的请求)。以下是从here
获取的代码#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
int main() {
int create_socket, new_socket;
socklen_t addrlen;
int bufsize = 1024;
char *buffer = malloc(bufsize);
struct sockaddr_in address;
if ((create_socket = socket(AF_INET, SOCK_STREAM, 0)) > 0){
printf("The socket was created\n");
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(15000);
if (bind(create_socket, (struct sockaddr *) &address, sizeof(address)) == 0){
printf("Binding Socket\n");
}
while (1) {
if (listen(create_socket, 10) < 0) {
perror("server: listen");
exit(1);
}
if ((new_socket = accept(create_socket, (struct sockaddr *) &address, &addrlen)) < 0) {
perror("server: accept");
exit(1);
}
if (new_socket > 0){
printf("The Client is connected...\n");
}
recv(new_socket, buffer, bufsize, 0);
printf("%s\n", buffer);
write(new_socket, "HTTP/1.1 200 OK\n", 16);
write(new_socket, "Content-length: 46\n", 19);
write(new_socket, "Content-Type: text/html\n\n", 25);
write(new_socket, "<html><body><H1>Hello A</H1></body></html>",46);
close(new_socket);
}
close(create_socket);
return 0;
}
当我运行它时,我没有得到终端控制。
如何在后台运行它以便我的终端返回?
我遵循了一些建议:
但所有这些都与 $ ./sample
具有相同的效果有些建议是关于使用fork但我不知道如何实现它。
感谢一些帮助。
答案 0 :(得分:2)
我猜你在Linux上
我遵循了一些建议:
$ ./sample & $ ./sample & > /dev/null $ nohup ./sample &
但所有这些都与$ ./sample
具有相同的效果
你确定吗?你应该在终端上得到一个shell提示符(你不会只用./sample
命令)。当然,您不应该输入$
,而是shell prompt。
关于fork,我们没有时间在答案中解释它(理解起来很棘手)。花几个小时或几天阅读Advanced Linux Programming或其他一些Unix或POSIX编程书的几个章节,并阅读fork(2)
您可以考虑使用daemon(3)(内部会调用fork(2) ...)和syslog(3)(特别是如果您将noclose
作为0
传递或false
至daemon
)
也许您可以使用
开始main
int main(int argc, char**argv) {
int create_socket= -1, new_socket= -1;
socklen_t addrlen =0;
int bufsize = 1024;
char *buffer = malloc(bufsize);
if (!buffer) { perror("malloc buffer"); exit(EXIT_FAILURE); };
if (argc > 1 && !strcmp(argv[1], "-d")) {
printf("daemonizing...\n"); fflush(NULL);
if (daemon(/*nochdir*/true, /*noclose*/true))
{ perror("daemon failed"; exit(EXIT_FAILURE); };
printf("daemonized, pid %d\n", (int)getpid());
}
因此,当您运行./sample -d
时,它将自我守护,即将服务器作为守护程序(分叉)进程运行。
顺便说一句, 完整 HTTP协议非常复杂 (超过一百页指定)。您可以考虑使用某些HTTP服务器库,例如libonion 。
不要忘记编译所有警告&amp;调试信息(gcc -Wall -Wextra -g
)并使用调试器(gdb
),也可能strace
和valgrind
......
PS。实际上,您需要ten years来学习编程。复制一些随机下载的C代码并盲目地编辑它是恕我直言(并可能会损害您的系统)。你应该很清楚程序在做什么。