Linux C编程 - kill()和sleep()

时间:2014-03-12 21:41:08

标签: c linux signals sleep

我有一些代码只是创建一个子进程,然后父和子轮流对变量进行数学运算并输出结果。我现在正在使用它,但是我意外地发现只有当我在kill()之前放入一个sleep()时才进行睡眠以观察文件本身的结果。任何人都可以向我解释这种行为吗?没有sleep(),子进程永远不会运行。我在Windows 8上的VM VirtualBox上使用Linux,这是HW,所以我不允许使用pipe()。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>

void sigHandler(int signo)
{
    signal(signo, sigHandler);
}

int main(int argc, char * argv[])
{
    int file; 
    int x = 0;
    pid_t pid;
    char filename[17] = "sigpong_temp.txt";
    file = creat(filename, S_IRWXU);
    fprintf(stdout, "initial value %d\n", x);
    const int csize = 10;
    char c[csize];

    sprintf(c, "%d", x);
    write(file, &c, strlen(c));
    close(file);
    file = open(filename, O_RDWR);
    signal(SIGUSR1, sigHandler);
    pid = fork();

    if (pid > 0) {
        for (int i = 0; i < 5; i++) {
            lseek(file, 0, SEEK_SET);
            read(file, &c, csize);
            x = atoi(c);
            x++;
            sprintf(c, "%d", x);
            fprintf(stdout, "Parent: x =\t%d\n", x);
            lseek(file, 0, SEEK_SET);
            write(file, &c, strlen(c));
            sleep(1);
            kill(pid, SIGUSR1);
            pause();
        } 
        close(file);
        _exit(EXIT_SUCCESS);
    }

    else {
        for (int i = 0; i < 5; i++) {
            pause();            
            lseek(file, 0, SEEK_SET);
            read(file, &c, csize);
            x = atoi(c);
            x = x * 10;
            sprintf(c, "%d", x);
            fprintf(stdout, "Child: x =\t%d\n", x);
            lseek(file, 0, SEEK_SET);
            write(file, &c, strlen(c));
            kill(getppid(), SIGUSR1);
        }
        close(file);                
        exit(EXIT_SUCCESS);
    }
}

0 个答案:

没有答案