我有一些代码只是创建一个子进程,然后父和子轮流对变量进行数学运算并输出结果。我现在正在使用它,但是我意外地发现只有当我在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);
}
}