2017-01-16 55 views
0

试图在两个进程之间创建信号量rutine,但代码似乎太早打破。试图与成功的其他学生进行比较,我们的代码看起来几乎相同,只是我的分叉只在semget和semctl之后进行。两个进程之间的信号量不能使用fork

#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; 
} 

回答

2

当您测试err调用semctl后,没有在if语句中的错误。原因是很难看到和模糊我的评论,太靠近代码。

这里是没有这种评论测试:

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

    return 0; 
} 

的条件后的分号使得这个if一个空体:将执行检查,但什么都不做。

花括号中的代码块无条件输入,无论err的值如何。这些块是合法的,有时用于构建代码并定义紧密的范围变量。

TL; DR:删除分号:

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

一个体面的编译器应该提醒你一下。例如,在osx上使用clang我得到'警告:如果语句有空身体[-empty-body] if(0); ^' (有一些更有用的信息,所有更好的格式比我能在这个评论中重现!) –