每次按下 ctrl + z 都会生成一个随机数
Everytime ctrl + z is pressed a random number is generated
直奔主题,如何让 Ctrl+z 执行标题所述的操作?
我的程序实现了一个 parent 进程,该进程创建了一个 child 进程。
两个进程都将显示进程 ID,一旦 child 终止,信号将发送到 parent 进程,并且 parent 信号处理程序将显示一条文本,说明信号已被捕获。
在child进程中,除了显示child的进程ID外,每次按下Ctrl+z时,它必须生成一个10到50之间的随机数。到目前为止,我只能让 child 进程生成 1 个随机数。
下面是我的代码:
void main() {
int pid;
int x;
int fd[2];
const int MAXLINE=4096;
char line[MAXLINE];
pid=fork();
if (pipe(fd) < 0) {
printf("Pipe error!");
}
if (pid < 0) {
printf("Fork error!");
} else if (pid == 0) { //Child process
signal(SIGTSTP, childsignal_handler);
printf("The process id is: %i\n", getpid());
sleep(1000); //Implemented to wait for a signal
} else {
printf("The process id is: %i\n", getpid()); //Parent process
pause(); //Waits for the Child process to finish
}
}
parent 信号处理程序:
void parentsignal_handler(int signo) { //Signal Handler for the parent process
printf("The signal in the parent process has been captured\n");
}
child 信号处理程序:
void childsignal_handler(int signo) { //Signal Handler for the child process
signal(SIGTSTP, childsignal_handler);
printf("\nThe signal in the child process has been captured\n");
randomnumbergenerator();
pause();
}
随机数生成器:
void randomnumbergenerator() { //Random number generator to run everytime Ctrl+z is pressed
//signal(SIGTSTP, childsignal_handler);
int number;
int number2 = 10;
printf("Welcome to random number generator!");
printf("\nRandom number generated = %d\n", rand() % 40 + 10);
}
PS:我已经阅读了一些关于各种解决方案的文档,例如 sigsuspend、sigprocmask、pause 等等,但是 none 目前为止它们都有效。
以下是我目前已阅读的一些文档:
https://www.gnu.org/software/libc/manual/html_node/Waiting-for-a-Signal.html#Waiting-for-a-Signal
https://man7.org/linux/man-pages/man2/pause.2.html
i need to implement a signal that will detect the child terminating
您并不完全需要实施信号;你只需要安装你已经拥有的处理程序:
signal(SIGCLD, parentsignal_handler);
how do I make Ctrl+z do what the title states?
So far I can only make the child process generate 1 random number.
为了防止父进程被挂起(并因此失去信号传递),请忽略父进程中的 STOP 信号:
signal(SIGTSTP, SIG_IGN);
你真的应该注意 Ian Abbott 的第一条评论并从信号处理程序中删除 pause()
;否则在按下 Ctrl-Z 后程序将不会结束。同时将 sleep(…)
更改为 while (sleep(…))
以保持定时暂停而不是无限的 pause()
.
直奔主题,如何让 Ctrl+z 执行标题所述的操作?
我的程序实现了一个 parent 进程,该进程创建了一个 child 进程。 两个进程都将显示进程 ID,一旦 child 终止,信号将发送到 parent 进程,并且 parent 信号处理程序将显示一条文本,说明信号已被捕获。
在child进程中,除了显示child的进程ID外,每次按下Ctrl+z时,它必须生成一个10到50之间的随机数。到目前为止,我只能让 child 进程生成 1 个随机数。
下面是我的代码:
void main() {
int pid;
int x;
int fd[2];
const int MAXLINE=4096;
char line[MAXLINE];
pid=fork();
if (pipe(fd) < 0) {
printf("Pipe error!");
}
if (pid < 0) {
printf("Fork error!");
} else if (pid == 0) { //Child process
signal(SIGTSTP, childsignal_handler);
printf("The process id is: %i\n", getpid());
sleep(1000); //Implemented to wait for a signal
} else {
printf("The process id is: %i\n", getpid()); //Parent process
pause(); //Waits for the Child process to finish
}
}
parent 信号处理程序:
void parentsignal_handler(int signo) { //Signal Handler for the parent process
printf("The signal in the parent process has been captured\n");
}
child 信号处理程序:
void childsignal_handler(int signo) { //Signal Handler for the child process
signal(SIGTSTP, childsignal_handler);
printf("\nThe signal in the child process has been captured\n");
randomnumbergenerator();
pause();
}
随机数生成器:
void randomnumbergenerator() { //Random number generator to run everytime Ctrl+z is pressed
//signal(SIGTSTP, childsignal_handler);
int number;
int number2 = 10;
printf("Welcome to random number generator!");
printf("\nRandom number generated = %d\n", rand() % 40 + 10);
}
PS:我已经阅读了一些关于各种解决方案的文档,例如 sigsuspend、sigprocmask、pause 等等,但是 none 目前为止它们都有效。
以下是我目前已阅读的一些文档:
https://www.gnu.org/software/libc/manual/html_node/Waiting-for-a-Signal.html#Waiting-for-a-Signal https://man7.org/linux/man-pages/man2/pause.2.html
i need to implement a signal that will detect the child terminating
您并不完全需要实施信号;你只需要安装你已经拥有的处理程序:
signal(SIGCLD, parentsignal_handler);
how do I make Ctrl+z do what the title states?
So far I can only make the child process generate 1 random number.
为了防止父进程被挂起(并因此失去信号传递),请忽略父进程中的 STOP 信号:
signal(SIGTSTP, SIG_IGN);
你真的应该注意 Ian Abbott 的第一条评论并从信号处理程序中删除 pause()
;否则在按下 Ctrl-Z 后程序将不会结束。同时将 sleep(…)
更改为 while (sleep(…))
以保持定时暂停而不是无限的 pause()
.