C 在进程(而不是线程)中使用semaphore.h

C 在进程(而不是线程)中使用semaphore.h,c,process,fork,parent-child,semaphore,C,Process,Fork,Parent Child,Semaphore,我有以下代码: #include <stdio.h> #include <unistd.h> #include <semaphore.h> #include <sys/shm.h> #include <sys/stat.h> #include <sys/types.h> int main(){ int segment_n; int segment_sem; int *shared_n; se

我有以下代码:

#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(){
    int segment_n;
    int segment_sem;
    int *shared_n;
    sem_t *shared_sem;
    int pid_int;
    pid_t pid;

    segment_n = shmget(IPC_PRIVATE, sizeof(int), S_IRUSR | S_IWUSR);
    segment_sem = shmget(IPC_PRIVATE, sizeof(sem_t), S_IRUSR | S_IWUSR);
    shared_n = (int *)shmat(segment_n, NULL, 0);
    shared_sem = (sem_t *)shmat(segment_sem, NULL, 0);

    sem_init(shared_sem, 0, 0);

    scanf("%d", shared_n);

    pid = fork();
    if(pid < 0){
        return 1;
    } else if(pid == 0){
    pid_int = (int)getpid();
    if(pid_int > *shared_n){
        *shared_n = 1;
        }else if(pid_int == *shared_n){
            *shared_n = 0;
        } else {
            *shared_n = -1;
        }
        sem_post(shared_sem);
        return 0;
    } else {
        sem_wait(shared_sem);
        printf("returns: %d\n", *shared_n);
        return 0;
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
int段n;
int段_-sem;
int*共享\u n;
sem_t*共享的sem;
int-pid_-int;
pid_t pid;
段n=shmget(IPC_PRIVATE,sizeof(int),S_IRUSR | S_IWUSR);
分段=shmget(IPC_私有、sizeof(sem_t)、S_IRUSR | S_IWUSR);
shared_n=(int*)shmat(segment_n,NULL,0);
shared_sem=(sem_t*)shmat(segment_sem,NULL,0);
sem_init(shared_sem,0,0);
scanf(“%d”,共享);
pid=fork();
if(pid<0){
返回1;
}否则如果(pid==0){
pid_int=(int)getpid();
如果(pid_int>*共享){
*共享n=1;
}else if(pid_int==*共享){
*共享n=0;
}否则{
*共享n=-1;
}
高级管理人员职位(共享高级管理人员职位);
返回0;
}否则{
sem_wait(共享_sem);
printf(“返回:%d\n”,*shared\n);
返回0;
}
返回0;
}
该程序创建一个子进程,该进程验证共享中的数字是否为自己pid的>、<或==而不是分别写入共享1、-1或0

问题是,当我编译它时,它会给我以下输出:

提前感谢您的帮助


Lorenzo

您必须使用-pthread链接文件

“gcc-pthread processi_esame.c-o processi”

这是Linux吗?说明您需要链接pthread库

gcc foo.c -o foo -pthread

-pthread
。即使不使用pthreads,也需要库来使用信号量函数。此外,您还需要使用
pshared!=0
@Aneri是!!非常感谢,这是正确的答案!但我在哪里能找到解决办法呢?我在网上到处都搜索过。谷歌搜索say
sem\u init library
,你会得到这个链接