【问题标题】:How do I sync the outputs of two processes using a semaphore with C in Linux?如何在 Linux 中使用信号量和 C 同步两个进程的输出?
【发布时间】:2020-07-08 18:52:14
【问题描述】:

我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>

#define SEMAPHORE 0

int main(int argc, char *argv[])
{
    int semid, pid, j = 10;
    struct sembuf operation;
    key_t key;

    key = ftok(argv[0], 'U');

    if ((semid = semget(key, 1, IPC_CREAT | 0600)) == -1)
    {
        perror("Error at semget");
        exit(-1);
    }
    semctl(semid, SEMAPHORE, SETVAL, 1);

    /* Child is created  */
    if ((pid = fork()) == -1)
    {
        perror("Error at fork");
        exit(-1);
    }
    else if (pid == 0)
    {
        /* Code corresponding to the child process  */
        while (j)
        {
            /* DOWN operation is performed at the semaphore  */
            operation.sem_flg = 0;
            operation.sem_op = -1;
            operation.sem_num = SEMAPHORE;

            semop(semid, &operation, 1);

            printf("I AM THE CHILD PROCESS, IMPRESSION: %d\n", j--);

            /* UP operation is performed at the semaphore  */
            operation.sem_op = 1;
            operation.sem_num = SEMAPHORE;
            semop(semid, &operation, 1);
        }
    }
    else
    {
        /* Code corresponding to the parent process */
        while (j)
        {
            /* DOWN operation is performed at the semaphore */
            operation.sem_flg = 0;
            operation.sem_op = -1;
            operation.sem_num = SEMAPHORE;

            semop(semid, &operation, 1);

            printf("I AM THE FATHER PROCESS, IMPRESSION: %d\n", j--);

            /* UP operation is performed at the semaphore */
            operation.sem_op = 1;
            operation.sem_num = SEMAPHORE;
            semop(semid, &operation, 1);
        }
    }
}

所以我可以期待以下输出:

I AM THE FATHER PROCESS, IMPRESSION: 10
I AM THE CHILD PROCESS, IMPRESSION: 10
I AM THE FATHER PROCESS, IMPRESSION: 9
I AM THE CHILD PROCESS, IMPRESSION: 9
I AM THE FATHER PROCESS, IMPRESSION: 8
I AM THE CHILD PROCESS, IMPRESSION: 8
I AM THE FATHER PROCESS, IMPRESSION: 7
I AM THE CHILD PROCESS, IMPRESSION: 7
I AM THE FATHER PROCESS, IMPRESSION: 6
I AM THE CHILD PROCESS, IMPRESSION: 6
I AM THE FATHER PROCESS, IMPRESSION: 5
I AM THE CHILD PROCESS, IMPRESSION: 5
I AM THE FATHER PROCESS, IMPRESSION: 4
I AM THE CHILD PROCESS, IMPRESSION: 4
I AM THE FATHER PROCESS, IMPRESSION: 3
I AM THE CHILD PROCESS, IMPRESSION: 3
I AM THE FATHER PROCESS, IMPRESSION: 2
I AM THE CHILD PROCESS, IMPRESSION: 2
I AM THE FATHER PROCESS, IMPRESSION: 1
I AM THE CHILD PROCESS, IMPRESSION: 1

或者先是孩子,然后是父亲。但是,我运行它,它产生的输出如下:

I AM THE FATHER PROCESS, IMPRESSION: 10
I AM THE FATHER PROCESS, IMPRESSION: 9
I AM THE FATHER PROCESS, IMPRESSION: 8
I AM THE FATHER PROCESS, IMPRESSION: 7
I AM THE FATHER PROCESS, IMPRESSION: 6
I AM THE FATHER PROCESS, IMPRESSION: 5
I AM THE FATHER PROCESS, IMPRESSION: 4
I AM THE FATHER PROCESS, IMPRESSION: 3
I AM THE FATHER PROCESS, IMPRESSION: 2
I AM THE FATHER PROCESS, IMPRESSION: 1
I AM THE CHILD PROCESS, IMPRESSION: 10
I AM THE CHILD PROCESS, IMPRESSION: 9
I AM THE CHILD PROCESS, IMPRESSION: 8
I AM THE CHILD PROCESS, IMPRESSION: 7
I AM THE CHILD PROCESS, IMPRESSION: 6
I AM THE CHILD PROCESS, IMPRESSION: 5
I AM THE CHILD PROCESS, IMPRESSION: 4
I AM THE CHILD PROCESS, IMPRESSION: 3
I AM THE CHILD PROCESS, IMPRESSION: 2
I AM THE CHILD PROCESS, IMPRESSION: 1

或者有时会出现这种印象,但我没有得到预期的印象:

I AM THE FATHER PROCESS, IMPRESSION: 10
I AM THE FATHER PROCESS, IMPRESSION: 9
I AM THE CHILD PROCESS, IMPRESSION: 10
I AM THE CHILD PROCESS, IMPRESSION: 9
I AM THE CHILD PROCESS, IMPRESSION: 8
I AM THE CHILD PROCESS, IMPRESSION: 7
I AM THE CHILD PROCESS, IMPRESSION: 6
I AM THE CHILD PROCESS, IMPRESSION: 5
I AM THE FATHER PROCESS, IMPRESSION: 8
I AM THE FATHER PROCESS, IMPRESSION: 7
I AM THE FATHER PROCESS, IMPRESSION: 6
I AM THE CHILD PROCESS, IMPRESSION: 4
I AM THE CHILD PROCESS, IMPRESSION: 3
I AM THE CHILD PROCESS, IMPRESSION: 2
I AM THE CHILD PROCESS, IMPRESSION: 1
I AM THE FATHER PROCESS, IMPRESSION: 5
I AM THE FATHER PROCESS, IMPRESSION: 4
I AM THE FATHER PROCESS, IMPRESSION: 3
I AM THE FATHER PROCESS, IMPRESSION: 2
I AM THE FATHER PROCESS, IMPRESSION: 1

我知道进程的执行顺序直接取决于操作系统,但不是说当两个进程之一UP时,另一个应该进入运行吗?

所以我的问题是,这里到底发生了什么?

【问题讨论】:

    标签: c linux operating-system semaphore


    【解决方案1】:

    令P(sem)表示信号量sem的向下操作,V(sem)表示信号量sem的向上操作。

    目前,您的代码是这样的,

    // semaphore s1
    s1 = 1;
    // parent process
    P (s1);  
     // work
    V (s1)
    
    // child process
    P (s1)
      // work
    V (s1)
    

    所以这里所说的是一次只有一个进程可以做“工作”,而内核正在遵循它。

    要同步两个进程的输出,需要做以下事情。

    // semaphores, sem-parent, sem-child
    sem-parent = 1; sem-child = 0;
    
    // parent process
    P (sem-parent);
       // work
    V (sem-child);
    
    // child process
    P (sem-child);
       // work
    V (sem-parent);
    

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 1970-01-01
      • 2023-01-29
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2017-04-10
      相关资源
      最近更新 更多