Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 叉一个孩子,从控制台阅读_C_Linux_Fork_Alarm - Fatal编程技术网

C 叉一个孩子,从控制台阅读

C 叉一个孩子,从控制台阅读,c,linux,fork,alarm,C,Linux,Fork,Alarm,一种c程序,它派生一个子程序,并从键盘上获取整数,最长10秒,10秒后停止读取并检查是否读取了任何数字,如果没有读取任何数字,它将终止子程序,否则它将在屏幕上打印读取的数字并终止,它不会显示结果 #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<unistd.h> #include<signal.h> #include<string.h>

一种c程序,它派生一个子程序,并从键盘上获取整数,最长10秒,10秒后停止读取并检查是否读取了任何数字,如果没有读取任何数字,它将终止子程序,否则它将在屏幕上打印读取的数字并终止,它不会显示结果

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/errno.h>



int status,j,i=0;
pid_t son1, son2;
int string[20];
char s[5];


void handler(int signum)
{
if(i==0)
kill(son1,SIGKILL);
}

void signal_handler_1(int sig_num)
{
  printf("\nI sent the signal SIGUSR1 to my child\n");

}


main(){

    son1=fork();
     if(son1==0)
     {
        signal(SIGUSR1 , signal_handler_1);
        printf("I'm son1, my id is: %d\n", getpid());

      pause();
        printf("I'm son1 exitting: %d\n", getpid());

      exit(1);

    }
    if(son1>0){

    printf("I'm father, my id is: %d\n", getpid());
    signal(SIGALRM,handler);

         alarm(10);//how can i terminate the reading process after alarm??

               while(fgets(s,5,stdin)!=NULL)
                {
                  sscanf(s,"%d",&string[i]);
                  i++;
                }


              for(j=0;j<i;j++)
                printf("%d\n",string[j]);

              kill(son1,SIGUSR1);


              wait(&status);


    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int状态,j,i=0;
pid_t son1、son2;
int字符串[20];
chars[5];
无效处理程序(int-signum)
{
如果(i==0)
kill(son1,SIGKILL);
}
无效信号处理器1(int sig num)
{
printf(“\n我向我的孩子发送了信号SIGUSR1”\n”);
}
main(){
son1=fork();
如果(son1==0)
{
信号(SIGUSR1,信号处理器1);
printf(“我是son1,我的id是:%d\n”,getpid());
暂停();
printf(“我是son1退出:%d\n”,getpid());
出口(1);
}
如果(son1>0){
printf(“我是父亲,我的id是:%d\n”,getpid());
信号机(信号机、处理器);
报警(10);//报警后如何终止读取过程??
while(fgets(s,5,stdin)!=NULL)
{
sscanf(s、%d、&string[i]);
i++;
}

对于(j=0;j,在运行SIGALRM的信号处理程序后,父级返回while循环

此外,正如linkdd所说,请更详细地描述问题

在您的代码中,父级将SIGKILL发送给子级,子级将失效,即由于父级被卡住而成为“僵尸”。父级从未注意到10秒已经过去,并且永远读取输入

这不是最漂亮的方式,但这会让它发挥作用

定义全局

int alarm_received = 0;
编辑父信号处理器,以在警报关闭时设置标志

void handler(int signum)
{
    if(i==0){
        kill(son1,SIGUSR1);
    }
    alarm_received = 1;
}
子信号处理器可能是这样的。在信号处理器内部调用printf是不好的

void signal_handler_1(int sig_num)
{
    char msg[] = "Child received SIGUSR1\n";
    write(STDOUT_FILENO, msg, sizeof(msg));
}
更改while循环以检查信号是否已发送。这样父级就不会被卡住

while(alarm_received == 0)
{
    fgets(s,5,stdin);
    sscanf(s,"%d",&string[i]);
    i++;
}

fgets()在接收到信号后很可能需要(取决于操作系统)一个空行,因为read()(在fgets内部)操作系统重新启动。输入的解析也非常脆弱。

到底是什么问题?它不显示结果并挂起。我想在10秒后终止控制台,检查结果并打印读取的数字。我想在10秒后停止屏幕并打印结果