繁体   English   中英

使用fork无法在两个进程之间使用信号量

[英]semaphore between two processes doesn't work using fork

试图在两个进程之间创建信号量常规,但代码似乎过早中断。 试图与其他成功的学生进行比较,我们的代码看起来几乎相同,除了我仅在semget和semctl之后才进行分叉。

   #include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
    pid_t n;
    int semid;
    int key = 98757;
    short sarray[1] = {2};
    struct sembuf sops[1];
    int err;

    semid = semget(key, 1, IPC_CREAT | 0666);
    if (semid == -1)
    {
        perror("semid failed");
        return 0;
    }

    err = semctl(semid, 1, SETALL, sarray);
    if (err == -1);/*code beakes down here*/
    {
        perror("semctl failed");

        return 0;
    }

    n = fork();

    if (n < 0)
    {
        printf("n < 0");
        return 0;
    }
    else if (n==0)/*child*/
    {
        sops[0].sem_num = 0;
        sops[0].sem_op = 0;
        sops[0].sem_flg = 0;
        err = semop(semid, sops, 1);
        if (err < 0)
        {
            printf("debugging semid < 0");
            return 0;
        }
        printf("%d", n);
        exit(0);
    }
    else/*parent*/
    {
        sleep(3);
        sops[0].sem_num = 0;
        sops[0].sem_op = -1;
        sops[0].sem_flg = 0;
        err = semop(semid, sops, 1);
        if (err < 0)
        {
            printf("debugging semid < 0");
            return 0;
        }
        wait(0);
    }

    return 0;
}

在调用semctl后测试err时, if语句semctl出现错误。 原因很难看到,并且使我的注释过于靠近代码。

这是没有评论的测试:

if (err == -1);
{
    perror("semctl failed");

    return 0;
}

条件后的分号表示if为空:执行检查,但不执行任何操作。

大括号中的代码块是无条件输入的,而不管err的值如何。 此类块是合法的,有时对构造代码和定义范围狭窄的变量很有用。

TL; DR :删除分号:

if (err == -1) {
    perror("semctl failed");
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM