在raspi中的fork错误

时间:2018-11-05 04:08:59

标签: linux process fork raspberry-pi3

我为我缺乏英语而道歉。

我正在制作一个TCP / NRF Raspi程序。

但是,我认为我与Linux的问题比Raspi更重要。所以我在stackoverflow中写了这个问题。

首先,我的代码

    #include <stdio.h>
    #include <time.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    #include <RF24/RF24.h>
    #include <sys/socket.h>
    #include <sys/stat.h>
    #include <arpa/inet.h>

    // HEADER LIST

    using namespace std;

    RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
    // NRF24L01 SETTING CE - PIN 15 , CSN - PIN 24

    const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL };
    //RADIO PIPE SETTING

    #define TCP_PORT 8888
    #define BUFSIZE 100
    //PORT SETTING

    int main(int argc, char**){

        FILE *fp;
        int fd;
        time_t now_time;
struct tm *now_date;
char buf1[40];
char buf2[10];
int serv_sock;
struct sockaddr_in clnt_addr;
int clnt_sock;
struct sockaddr_in serv_addr;
socklen_t clnt_addr_size;
char send_buf[BUFSIZE]= "";
char buf[BUFSIZE] = "";
pid_t  pid1, pid2;
fd = open("log", O_RDWR | O_CREAT | O_APPEND, 0644);

if((serv_sock = socket(PF_INET, SOCK_STREAM, 0)) <  0){
    perror("SOCKET ERROR");
    return 0;
}
//socket create

bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(TCP_PORT);
//socket setting

if(bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){
    perror("BIND ERROR");
    return 0;
}
// bind

if(listen(serv_sock, 8) < 0){
    perror("LISTEN ERROR");
    return 0;
}
//listen

radio.begin();
radio.setRetries(15,15);
radio.printDetails();
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.startListening();
//radio setting

printf("******SERVER READY******\n");
while (1)
{
    pid1 = fork();
    switch (pid1)
    {
    case -1: // FORK ERROR
        perror("FORK1 ERROR");
        return 0;
        break;

    case 0: //SON PROCESS FOR TCP
        clnt_addr_size = sizeof(clnt_addr);
        clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size);
        if (clnt_sock < 3) {
            perror("ACCEPT ERROR");
            return 0;
        }//ACCEPT ERROR
        printf("CLIENT IS CONNECTED : %s\n", inet_ntoa(clnt_addr.sin_addr));
        fp = fopen("log", "r");

        pid2 = fork() :
            switch (pid2) {
            case -1:
                perror("FORK2 ERROR");
                return 0;
                break;

            case 0:
                fp = fopen("log", "r");
                if (fp == NULL) {
                    write(clnt_sock, "NOTHING", 9);
                }
                else {
                    while (fgets(send_buf, sizeof(send_buf), fp) != NULL) {
                        write(clnt_sock, send_buf, strlen(send_buf) + 1);
                    }//while
                }//else

                if (read(clnt_sock, buf, sizeof(buf)) < 0)
                {
                    close(clnt_sock);
                }//if
                return 0;
                break;
            }//switch2
    default: // PARENT PROCESS FOR NRF
        if (radio.available()) {
            char msg[2] = "";
            radio.read(&msg, sizeof(msg));
            time(&now_time);
            now_date = localtime(&now_time);
            strcpy(buf1, asctime(now_date));
            sprintf(buf2, "MODULE %s\n", msg);
            strcat(buf1, buf2);
            printf("MODULE %s DETECTED\n", msg);
            write(fd, buf1, strlen(buf1));
            delay(925);
            break;
        }
    }//switch1
}// while
close(serv_sock);
close(fd);
fclose(fp);
return 0;
}//main
NRF的

父程序循环从arduino监听。它运作良好。 pid1用于TCP的fork子程序与智能手机连接。它运作良好。 pid2 fork子程序,用于将TCP写入智能手机。这是问题。

在程序操作期间,pid2子不发送TCP套接字。 但是,当程序结束时,pid2发送TCP套接字,智能手机接收。

我和我的朋友想了很多,但是我们解决不了。

请给我一些解决此问题的提示。

0 个答案:

没有答案