【问题标题】:No output on using Semaphores使用信号量没有输出
【发布时间】:2014-07-13 04:53:48
【问题描述】:

我想在一个项目中使用信号量,但我被困在这里。我编写了三个程序,用于在所有三个程序的关键区域打印一条语句,以查看信号量如何进行同步。没有输出,程序进入睡眠状态。这是代码-

    int main()
    {
        int fd,ret,kk,x=1,y=2;
        struct sembuf sem[2]={{0,-1,SEM_UNDO},
            {0,1,SEM_UNDO}};
        union semun a;
        a.val=1;
        kk=semget(1234,1,IPC_CREAT);
        semctl(kk,0,SETVAL);
        semop(kk,&sem[0],1);
        printf("In client1...\n");
        printf("In client1...\n");
        sleep(3);
        semop(kk,&sem[1],1);
    }

我制作了这个程序 client2 和 client3 的 2 个副本。

【问题讨论】:

    标签: synchronization semaphore


    【解决方案1】:

    根据您的代码,sem[0] 代表“id=0 的后信号量”,sem[1] 表示“等待 id=0 的信号量”。通过做

    semctl(kk,0,SETVAL);
    semop(kk,&sem[0],1);
    

    您正在尝试等待值为 0 的信号量。执行此操作的进程将等到信号量的值大于 0,在您的情况下,这绝不是真的。正在做

    union semun semopts;
    semopts.val = 1; 
    semctl(kk,0,SETVAL, semopts);
    

    在第一次使用信号量之前,应该解决你的问题。

    【讨论】:

    • 这永远不会起作用,因为第二个参数是针对 semnum 的,在我的情况下应该是 0,因为这是集合中的第一个 & 唯一。所以 0 代表索引。
    • 好吧,我上次使用 SysV 信号量已经有一段时间了。当然应该是union semun semopts; semopts.val = 1; semctl(kk,0,SETVAL, semopts); 我编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多