gpt4 book ai didi

c - 如何在单独的进程中从终端获取输入?

转载 作者:行者123 更新时间:2023-12-04 07:44:52 25 4
gpt4 key购买 nike

我尝试使用 fork() 以便在我的程序与服务器交换消息的同时从终端获取输入,但结果是一个程序甚至在我按下 Enter 键之前就在读取输入。
所以如果我使用这个:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <mqueue.h>
#include <sys/msg.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>


int main(int argc, char ** argv){
int pid = fork();

if (pid == 0){
for(int i =0; i<10; i++){
char command[255];
fgets (command, 255, stdin);
printf("%s\n", command);
sleep(1);
}
exit(0);
} else {

}
}
当我运行程序时,我没有做任何事情就会发生这种情况:











如果我使用 scanf("%s\n", command); 会发生完全相同的事情或 fgets (command, 255, stdin);以及我能找到的所有其他变化......
如果我将代码更改为
int main(int argc, char ** argv){
int pid = fork();

if (pid != 0){
for(int i =0; i<10; i++){
char command[255];
fgets (command, 255, stdin);
printf("%s\n", command);
sleep(1);
}
exit(0);
} else {

}
}
然后它工作正常,但我希望我的输入读取进程成为一个 child ,因为原始进程的 pid 是提供给我的服务器进程的信息的一部分。
一些附加信息:
我在编译程序时使用 makefile:
cc = gcc -Wall -D_DEFAULT_SOURCE -std=c11 -g

all: server client

dirs:
mkdir -p build

server: dirs utils server.c
$(cc) -c server.c -o build/server.o
$(cc) build/server.o build/utils.a -o server

client: dirs utils client.c
$(cc) -c client.c -o build/client.o
$(cc) build/client.o build/utils.a -o client

utils: dirs utils.c
$(cc) -c utils.c -o build/utils.o
ar rcs build/utils.a build/utils.o

problem: dirs problem.c
$(cc) -c problem.c -o build/problem.o
$(cc) build/problem.o -o problem

clean:
rm -Rf build *.out *.so *.o *.a

最佳答案

父进程死亡,子进程被收割者或子收割者进程采用。因此,您的子进程与终端“分离”,因此,父进程必须调用 wait()waitpid() .

 void init_reader(){
int pid = fork();

if (pid == 0){
for(int i =0; i<10; i++){
char command[255];
fgets (command, 255, stdin);
printf("%s\n", command);
sleep(1);
}
exit(0);
} else {
wait(NULL);
}
}

关于c - 如何在单独的进程中从终端获取输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67247344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com