我正在尝试编写一个基本过程控制块的程序,下面的代码显示了我在测试阶段所做的事情,我想知道我们是否可以在遇到一个孩子后重新开始,而不是再次分娩新孩子是的,我们怎么做
提前谢谢!
代码:
`
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<time.h>
#include<stdio.h>
#include<unistd.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int hell()
{
int j;
for(j=1;j<6;j++)
printf("%d hello\n",j);`
}
int hello(k)
{
int i
for(i=1;i<15;i++
printf("%5d hello \n", i);
}
void sigint()
{
signal(SIGCONT,sigint); /* reset signal */
printf("CHILD: I have received a SIGINT\n");
}
int main()
{
int i, status;
pid_t childID, endID,end1id,parentid;
time_t when;
label: if ((childID = fork()) == -1) {
perror("fork error");
exit(EXIT_FAILURE);
}
else if (childID == 0) {
time(&when);hell();
printf("k value %d\n",hello(5));
printf("Child process started at %s\n", ctime(&when));
printf("child PID : %d \n",getpid());
hello();
sleep(10);
//kill(childID, SIGKILL);
exit(EXIT_SUCCESS);
}
}
else {
time(&when);
printf("Parent process started at %s", ctime(&when));
printf("parent PID : %d\n",getpid());
hell();
parentid = getpid();
for(i = 0; i < 15; i++) {
endID =waitpid(childID,&status,WNOHANG|WUNTRACED);
printf("endid: %d\n",endID);
end1id = waitpid(parentid, &status, WNOHANG|WUNTRACED);
if (endID == -1) {
perror("waitpid error");
exit(EXIT_FAILURE);
}
else if (endID == 0) {
time(&when);
printf("Parent waiting for child at %s", ctime(&when));
sleep(1);
}
else if (endID == childID) {
if (WIFEXITED(status))
printf("Child ended normally\n\n");
else if (WIFSIGNALED(status)){
printf("Child ended because of an uncaught signal\n");goto label;}
else if (WIFSTOPPED(status)){
printf("Child process has stopped\n");goto label;}
exit(EXIT_SUCCESS);
}
}
}
答案 0 :(得分:3)
当您向子节点发出kill命令时,您可以使用SIGSTOP将其挂起而不会使其死亡,然后使用SIGCONT将其恢复到停止位置。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main() {
pid_t childId;
if ( ( childId = fork() ) == -1 ) {
printf( "child fork failed\n" );
} else if ( childId == 0 ) {
int i = 0;
while ( 1 ) {
printf( "infinite child loop ==> %d\n", ++i );
sleep( 1 );
}
} else {
printf( "parent: child started OK\n" );
sleep( 5 );
printf( "parent: stopping child - but letting it live\n" );
kill( childId, SIGSTOP );
sleep( 5 );
printf( "parent: resuming child since it stopped but never really died\n" );
kill( childId, SIGCONT );
printf( "parent: child should be running again where it left off\n" );
sleep( 5 );
}
}
输出:
parent: child started OK
infinite child loop ==> 1
infinite child loop ==> 2
infinite child loop ==> 3
infinite child loop ==> 4
infinite child loop ==> 5
infinite child loop ==> 6
parent: stopping child - but letting it live
parent: resuming child since it stopped but never really died
parent: child should be running again where it left off
infinite child loop ==> 7
infinite child loop ==> 8
infinite child loop ==> 9
infinite child loop ==> 10
infinite child loop ==> 11
infinite child loop ==> 12