C 使fork执行相等的次数,无限次

C 使fork执行相等的次数,无限次,c,unix,ipc,C,Unix,Ipc,我试图使下面的代码永远不允许+的数量大于-。我正在考虑添加一行简单的c sleep1,但我很好奇是否有更好的方法使数量相等。这应该是一个无限循环 int main{ iffork==0 while1{ 写1,-,1 } 其他的 while1{ 写1,+,1; } 返回0; } 这个函数是否正确使用信号量 int main{ int parent_sem=get_信号量0; int child\u sem=get\u信号量1; iffork==0 while1{ sem_waitchild_sem

我试图使下面的代码永远不允许+的数量大于-。我正在考虑添加一行简单的c sleep1,但我很好奇是否有更好的方法使数量相等。这应该是一个无限循环

int main{ iffork==0 while1{ 写1,-,1 } 其他的 while1{ 写1,+,1; } 返回0; } 这个函数是否正确使用信号量

int main{ int parent_sem=get_信号量0; int child\u sem=get\u信号量1; iffork==0 while1{ sem_waitchild_sem; 写1,-,1; sem_信号父项sem; } 其他的 while1{ sem_waitparent_sem; 写1,+,1; sem_signalchild_sem; } 返回0; }
这是近距离使用信号:

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

void usr1handler() {
}

int main(void) {
        int pid;

        signal(SIGUSR1, usr1handler);

        if ((pid = fork()) == 0) {
                while (1) {
                        pause();
                        write(1, "-", 1);
                        fflush(stdout);
                        kill(getppid(), SIGUSR1);
                }
        }
        else {

                sleep(1);

                while (1) {
                        write(1, "+", 1);
                        fflush(stdout);
                        kill(pid, SIGUSR1);
                        pause();
                }
        }

}

这方面的主要问题是比赛条件。如果一个进程在另一个进程进入暂停之前进入kill函数,程序将冻结。这可能足以让你开始。我在那里只睡了一个觉,这样你就可以看到它确实打印得很均匀。

这里是一个固定版本的信号量示例。我已经分配了共享内存,这样两个进程都可以通过fork访问信号量。我忘记了这是必要的,抱歉,并修复了信号量类型和调用

#include <unistd.h>
#include <semaphore.h>
#include <sys/mman.h>

int main() {
    // Create shared memory for two semaphores
    sem_t* sem = mmap(NULL, 2 * sizeof(sem_t), PROT_READ | PROT_WRITE,
                      MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    // Initialise parent and child semaphores: parent = 1, child = 0
    sem_t* parent_sem = sem;
    sem_t* child_sem = sem + 1;    
    sem_init(parent_sem, 1, 1);
    sem_init(child_sem, 1, 0);

    if (fork() == 0) {
        while(1) {
            // Child process
            sem_wait(child_sem);
            write(1, "-", 1);
            sem_post(parent_sem);
        }
    } else {
        while(1) {
            // Parent process
            sem_wait(parent_sem);
            write(1, "+", 1);
            sem_post(child_sem);
        }
    }

    return 0;
}

你想要IPC。例如,你可以使用一个信号量,让它们轮流写一个字符,但是Linux有很多选择,所以可能有更好的方法。是的,这将比lol复杂得多。你需要同步你的进程,因为他们需要知道彼此的状态。使用信号量的例子是什么?为什么要混合使用文件描述符write和stdio句柄fflushstdout?