【问题标题】:C segmentation fault (core dumped) on fork()fork() 上的 C 分段错误(核心转储)
【发布时间】:2014-11-17 21:15:52
【问题描述】:

我有一个 arduino 将温度发送到这个服务器脚本。 你会从代码中得到 jist,但问题是当我在 cli 输出 segmentation error (core dumped) 中收到我的第一条消息,然后 readIn()writeOut() 函数都由同一个进程执行(两者函数与sleep(1) 同步运行,$ps aux 下也只有 1 个进程。

#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
void writeOut();
void readIn();
int fd[2];

#define MAX_BUF 1024

int main(){
    printf("init\n");

    /*
    fd[0] = read descriptor
    fd[1] = write descriptor
    */

    int value = 0;
    pipe(fd);
    int pid = fork();
    if(pid == 0){
        /* parent process */
        readIn();
    } else{
        /* child process */
        writeOut();
    }
}
void writeOut(){
    char * value = 'start';
    while(1){
        read(fd[0], &value, MAX_BUF);
        printf("%s\n", value);

    }
}

void readIn(){
    char str[100];
    int listen_fd, comm_fd;

    struct sockaddr_in servaddr;
    listen_fd = socket(AF_INET, SOCK_STREAM, 0);

    bzero( &servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htons(INADDR_ANY);
    servaddr.sin_port = htons(8080);

    bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
    listen(listen_fd, 10);

    comm_fd = accept(listen_fd, (struct sockaddr *) NULL, NULL);
    while(1){
        bzero( str, 100);
        read(comm_fd, str, 100);
        printf("S: %s", str);
        write(comm_fd, str, strlen(str)+1);
        write(fd[1], &str, sizeof(str));
        sleep(1);   
    }

    printf("readIn Exit!");
exit(0);
}

【问题讨论】:

  • pid == 0 表示孩子,而不是您的 cmets 建议的父母。
  • 你应该检查pipe()的返回值。此外,bzero() 已被弃用。使用memset()
  • 我认为你们提到的内容并不重要。奇怪的是,fork 之后的所有分支都在同一个进程中运行。也许您可以先尝试检查fork,看看它是否正常工作。如果您使用的库与您的机器不兼容,尤其是在嵌入式系统中,我们无法找出问题所在。

标签: c fork


【解决方案1】:

writeOut() 中的char *value = 'start' 是错误的。首先,'start' 不是字符串。这是一个字符字面量。其次,如果它一个字符串,它将是不可变的。

【讨论】:

  • 我将其更改为 char value[50]; 并按照 cmets 中的建议检查管道
猜你喜欢
  • 2022-01-14
  • 2017-02-25
  • 2016-07-12
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多