两个进程之间的信号量不能使用fork
问题描述:
试图在两个进程之间创建信号量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;
}
答
当您测试err
调用semctl
后,没有在if
语句中的错误。原因是很难看到和模糊我的评论,太靠近代码。
这里是没有这种评论测试:
if (err == -1);
{
perror("semctl failed");
return 0;
}
的条件后的分号使得这个if
一个空体:将执行检查,但什么都不做。
花括号中的代码块无条件输入,无论err
的值如何。这些块是合法的,有时用于构建代码并定义紧密的范围变量。
TL; DR:删除分号:
if (err == -1) {
perror("semctl failed");
return 0;
}
一个体面的编译器应该提醒你一下。例如,在osx上使用clang我得到'警告:如果语句有空身体[-empty-body] if(0); ^' (有一些更有用的信息,所有更好的格式比我能在这个评论中重现!) –