我正在尝试创建一个程序,它让子进程休眠几秒钟,然后释放正在等待的父进程的信号量。我花了几天的时间阅读信号量和在线研究,但都很混乱。另外,每个例子都是一些看起来很简单的代码,每个代码都完全不同。试图用信号量做一个简单的程序
编辑:DERP!所以,代码不起作用。孩子(分)很好,但父母永远卡在sem_wait上。所以我在实现信号量方面似乎出了问题。
这是我到目前为止有:
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int j, dummy, intCast;
sem_t s;
if (argc < 2 || strcmp(argv[1], "--help") == 0){
printf("Usage: sem_sync X (X is one or more ints)");
exit(EXIT_FAILURE);
}
setbuf(stdout, NULL); /* Make stdout unbuffered, since we
terminate child with _exit() */
printf(" Parent started\n");
sem_init(&s, 0, 0);
for (j = 1; j < argc; j++) {
switch (fork()) {
case -1:
printf("Error on fork %d", j);
exit(EXIT_FAILURE);
case 0: /* Child */
intCast = atoi(argv[j]); // Casts the argument into an integer
printf("Child sleeping for %d seconds\n",intCast);
sleep(intCast);
sem_post(&s);
_exit(EXIT_SUCCESS);
default: /* Parent loops to create next child */
break;
}
}
printf(" Parent is waiting\n");
sem_wait(&s);
printf(" Parent ready to go\n");
exit(EXIT_SUCCESS);
}
这里的工作代码sem_open()和sem_close()
int main(int argc, char *argv[])
{
int j, intCast;
sem_t *s;
printf(" Parent started\n");
s = sem_open("file1", O_CREAT, 0600, 0);
if (s == SEM_FAILED){
printf("sem_open() failed. errno:\n");
}
for (j = 1; j < argc; j++) {
switch (fork()) {
case -1:
printf("Error on fork %d", j);
exit(EXIT_FAILURE);
case 0: /* Child */
intCast = atoi(argv[j]);
printf("Child sleeping for %d seconds\n",intCast);
sleep(intCast);
sem_post(s);
_exit(EXIT_SUCCESS);
default:
break;
}
}
printf(" Parent is waiting\n");
for (j = 1; j < argc; j++){
sem_wait(s);
}
sem_close(s);
exit(EXIT_SUCCESS);
}
那么这段代码有什么问题?这段代码对你来说似乎很长吗? – 2014-12-08 06:49:08
如果您提供问题会更有用,因为代码的长度似乎不是一个值得关注的问题。 – OshoParth 2014-12-08 06:54:23
对不起!我编辑了这篇文章,指出了代码的问题。 – Sidreal 2014-12-08 06:58:10