免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 C/C++ 请教
最近访问板块 发新帖
查看: 1342 | 回复: 2
打印 上一主题 下一主题

[C] 请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-30 13:25 |只看该作者 |倒序浏览
int main(int argc, char** argv) {

    /*variables for accountant server*/
    int sock, new_sock;
    struct sockaddr_in local_addr;
    pid_t pid;


    /*initial server for financial server*/
    sock = Init_data_comm_server(26987, &local_addr);

    /*begin accept the query from business server*/
    while (1) {
        if ((new_sock = accept(sock, (struct sockaddr *) & local_addr, &sin_size)) < 0) {
            perror("\033[1m\033[40;31maccepting query from client\033[0m\n";
            continue;
        }

        /*fork a child process*/
        if ((pid = fork()) < 0) {
            perror("\033[1m\033[40;31merror:server.c:main():fork\033[0m\n";
            close(new_sock);
            sleep(1);
            continue;
        } else if (0 == pid) {
            /* In the first child process*/
            /* Close the listening socket description */
            close(sock);
            if ((pid = fork()) < 0) {
                perror("\033[1m\033[40;31mproxy_init.caemon_foreground():fork()\033[0m\n";
                exit(1);
            } else if (pid > 0) {
                exit(0);
            }
                                                //业务处理部分
                                                。。。。。。。。
                                               
            printf(DEBUGFMT"\033[1m\033[40;32m SOC %d ,PID_%d PPID_%d send pkt: %s\033[0m\n\n", DEBUGARGS,new_sock ,getpid(),getppid(),buf_send);
            /*send packet to  client*/
            if ((count = send(new_sock, buf_send, strlen(buf_send), 0)) < 0) {
                perror("\033[1m\033[40;31msend data:\033[0m\n";
                exit(1);
            }

            close(new_sock);
            exit(0);
        }

        /* In the parent process */
        close(new_sock);

        if (waitpid(pid, NULL, 0) != pid) {
            perror("\033[1m\033[40;31mserver.c:waitpid\033[0m\n";
        }
    }

    PQfinish(conn_db);
    conn_db = NULL;

    return 0;
}

这是我业务处理程序的部分代码
程序在接受请求时创建的子进程PID为8896,父进程PID为8895,在业务处理完毕后,发送相应的时候,子进程PID为8896,父进程PID为1,为什么父进程的PID会改变,是我程序
的问题么,还有我的这个程序在进行业务处理的时候会不会产生线程冲突,因为这个程序要同时大量的操作一个数据表。下面是程序的输出部分:
SOCK 5 PID_8896 PPID_8895 recv packet:12000009053047939166
SOCK 5 PID_8896 PPID_1 send packet: 1200|00|0009053047939166

论坛徽章:
0
2 [报告]
发表于 2009-05-30 15:12 |只看该作者
if ((pid = fork()) < 0) {
            perror("\033[1m\033[40;31merror:server.c:main():fork\033[0m\n";
            close(new_sock);
            sleep(1);
            continue;
        } else if (0 == pid) {
            /* In the first child process*/
            /* Close the listening socket description */
            close(sock);
            if ((pid = fork()) < 0) {
                perror("\033[1m\033[40;31mproxy_init.caemon_foreground():fork()\033[0m\n";
                exit(1);
            } else if (pid > 0) {
                exit(0);
            }
你这里不是FORK了两次吗?而且在第二次FORK后你将父进程(也就是第一次FORK的子进程)退出,那第二次FORK的子进程就成孤儿进程了,他会被 INIT(1号进程)接管。所以前父进程为1。

如果你在进程中有对资源进程的竞态操作,就可能出现冲突,最好加上用于进程间通信的互斥锁,读写锁,条件变量那些。

论坛徽章:
0
3 [报告]
发表于 2009-05-30 16:07 |只看该作者
也就是说在线程A操作数据表的时候要把数据表锁死,其他的线程只能等待线程A退出后才能操作数据表
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP