Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中进程与信号量的通信_C_Synchronization_Ipc_Semaphore - Fatal编程技术网

C语言中进程与信号量的通信

C语言中进程与信号量的通信,c,synchronization,ipc,semaphore,C,Synchronization,Ipc,Semaphore,我正在写两个文件: 父.c带有父进程,子.c带有子进程。他们应该使用信号量进行同步。启动父进程(已编译)时,父进程将在子进程消息之后永远等待: 孩子们好了 神父 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include &l

我正在写两个文件: 父.c带有父进程,子.c带有子进程。他们应该使用信号量进行同步。启动父进程(已编译)时,父进程将在子进程消息之后永远等待: 孩子们好了

神父

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

typedef union _semun {
    int val;
        struct semid_ds *buf;
        ushort *array; 
    }   semun;


int initsem(key_t key){
    int status = 0, semid;
    semid = semget(key, 1, 0600 | IPC_CREAT | IPC_EXCL);
    if(semid == -1){
        if(errno == EEXIST){
            semid = semget(key, 1, 0);
        }
    else{
        semun arg;
        arg.val = 1;
        status = semctl(semid, 0, SETVAL, arg);
    }
    if(semid == -1 || status == -1){
        perror("initsem failed\n");
        return -1;
    } 
    return (semid);
    }
}

int waitSem(int semid) {
    struct sembuf wait_buf;
    wait_buf.sem_num = 0;
    wait_buf.sem_op = -1;
    if(semop(semid, &wait_buf, 1) == -1) {
        perror("waitSem failed");
        exit(1);
    }
return(0);
}

int signalSem(int semid) {
    struct sembuf signal_buf;
    signal_buf.sem_num = 0;
    signal_buf.sem_op = 1;
    if(semop(semid, &signal_buf, 1) == -1) {
        perror("signalSem failed");
        exit(1);
    }
return(0);
}


int main(){

    pid_t pid;
    key_t key;

    int semid;

    if(key = ftok("/home/user/Scrivania/test.txt", 'a') == -1){
        perror("IPC error: ftok\n");
        exit(1);
    }
    else{
        printf("Ftok done\n");
    }

    semid = initsem(key);

    pid = fork();

    if(pid < 0){
        printf("failed fork()\n");
    }

    else if(pid == 0){
        printf("Child process with PID: %d\n", pid);
        execl("/home/user/Desktop/son", "son", "",(char *)0);
    }
    else{
        printf("Father process with PID: %d\n", pid);

        printf("Waiting for my son\n");
        waitSem(semid);
        printf("My son has done\n");
        signalSem(semid);



    }

    return 0;

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类型定义联合体{
int-val;
结构semid_ds*buf;
ushort*阵列;
}塞蒙;
int initsem(键\u t键){
int status=0,semid;
semid=semget(键,10600 | IPC|u CREAT | IPC|u EXCL);
if(semid==-1){
if(errno==EEXIST){
semid=semget(键,1,0);
}
否则{
semun arg;
arg.val=1;
状态=semctl(semid,0,SETVAL,arg);
}
如果(semid=-1 | | status=-1){
perror(“初始化失败\n”);
返回-1;
} 
返回(semid);
}
}
int waitSem(int semid){
结构sembuf wait_buf;
wait_buf.sem_num=0;
wait_buf.sem_op=-1;
if(semop(semid,&wait_buf,1)=-1){
perror(“waitSem失败”);
出口(1);
}
返回(0);
}
int signalSem(int semid){
结构信号;
信号_buf.sem_num=0;
信号_buf.sem_op=1;
if(semop(semid,&signal_buf,1)=-1){
perror(“signalSem失败”);
出口(1);
}
返回(0);
}
int main(){
pid_t pid;
钥匙(t)钥匙;;
int-semid;
如果(key=ftok(“/home/user/Scrivania/test.txt,'a')=-1){
perror(“IPC错误:ftok\n”);
出口(1);
}
否则{
printf(“Ftok done\n”);
}
semid=initsem(键);
pid=fork();
if(pid<0){
printf(“失败的fork()\n”);
}
否则如果(pid==0){
printf(“具有PID的子进程:%d\n”,PID);
execl(“/home/user/Desktop/son”、“son”、“char*)0);
}
否则{
printf(“带PID的父进程:%d\n”,PID);
printf(“等待我的儿子”);
waitSem(semid);
printf(“我的儿子已经做了”\n”);
signalSem(semid);
}
返回0;
}
儿子,c

#包括
#包括
#包括
#包括
#包括
#包括
#包括
类型定义联合体{
int-val;
结构semid_ds*buf;
ushort*阵列;
}塞蒙;
int initsem(键\u t键){
int status=0,semid;
semid=semget(图例10600,不包括IPC);
if(semid==-1){
if(errno==EEXIST){
semid=semget(键,1,0);
}
否则{
semun arg;
arg.val=1;
状态=semctl(semid,0,SETVAL,arg);
}
如果(semid=-1 | | status=-1){
perror(“初始化失败\n”);
返回-1;
} 
返回(semid);
}
}
int waitSem(int semid){
结构sembuf wait_buf;
wait_buf.sem_num=0;
wait_buf.sem_op=-1;
if(semop(semid,&wait_buf,1)=-1){
perror(“waitSem失败”);
出口(1);
}
返回(0);
}
int signalSem(int semid){
结构信号;
信号_buf.sem_num=0;
信号_buf.sem_op=1;
if(semop(semid,&signal_buf,1)=-1){
perror(“signalSem失败”);
出口(1);
}
返回(0);
}
int main(){
pid_t pid;
钥匙(t)钥匙;;
int-semid;
如果(key=ftok(“/home/user/Desktop/test.txt,'a')=-1){
perror(“IPC错误:ftok\n”);
出口(1);
}
否则{
printf(“Ftok done\n”);
}
semid=initsem(键);
waitSem(semid);
printf(“预信号”);
signalSem(semid);
printf(“我的操作”);
返回0;
}

OT的可能重复:您不需要下划线来定义
结构
/
联合
,以下划线开头的单词将保留用于实现(
typedef union semun{..}semun;
可以)。您的进程使用不同的键。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

typedef union _semun {
    int val;
        struct semid_ds *buf;
        ushort *array; 
    }   semun;


int initsem(key_t key){
    int status = 0, semid;
    semid = semget(key, 1, 0600 | IPC_EXCL);
    if(semid == -1){
        if(errno == EEXIST){
            semid = semget(key, 1, 0);
        }
    else{
        semun arg;
        arg.val = 1;
        status = semctl(semid, 0, SETVAL, arg);
    }
    if(semid == -1 || status == -1){
        perror("initsem failed\n");
        return -1;
    } 
    return (semid);
    }
}



int waitSem(int semid) {
    struct sembuf wait_buf;
    wait_buf.sem_num = 0;
    wait_buf.sem_op = -1;
    if(semop(semid, &wait_buf, 1) == -1) {
        perror("waitSem failed");
        exit(1);
    }
return(0);
}

int signalSem(int semid) {
    struct sembuf signal_buf;
    signal_buf.sem_num = 0;
    signal_buf.sem_op = 1;
    if(semop(semid, &signal_buf, 1) == -1) {
        perror("signalSem failed");
        exit(1);
    }
return(0);
}


int main(){

    pid_t pid;
    key_t key;

    int semid;




    if(key = ftok("/home/user/Desktop/test.txt", 'a') == -1){
        perror("IPC error: ftok\n");
        exit(1);
    }
    else{
        printf("Ftok done\n");
    }


        semid = initsem(key);
        waitSem(semid);     
        printf("Pre signal\n");
        signalSem(semid);
        printf("My operation\n");



    return 0;

}