小编alk*_*alk的帖子

流程重新父母:控制谁是新父母

新父母总是"初始化"还是有某种方法来控制谁成为新的父母

维基百科似乎表明它总是"初始化".我真的希望事实并非如此.我尝试过setpgid和setsid所能想到的一切,但没有运气.现在,我看到这篇维基百科文章,我需要建议.

在类Unix操作系统中,任何孤立的进程都将立即被特殊的init系统进程采用.此操作称为重新父级并自动发生.尽管从技术上讲,该进程将"init"进程作为其父进程,但它仍称为孤立进程,因为最初创建它的进程不再存在. 取自维基百科

我问的原因是因为我正在制作一个运行许多工作流程的Mac应用程序.我希望这些工作进程在任务管理器的进程层次结构中显示为主进程的子进程.一些工作者作为不同的用户运行,并且在Mac OS XI上需要分叉两次以将权限传递给子进程.因为我"双叉"工作人员目前作为守护人员运行,当与任务管理员一起查看时,我看到工作人员正在将"init"作为他们的父进程.

unix fork process orphan process-reaper

8
推荐指数
2
解决办法
3330
查看次数

ftok()碰撞

ftok()用来为C应用程序使用的共享内存段生成标识符.我遇到了问题,在一个盒子上我遇到了root使用的标识符.我可以通过破解代码在这个例子中修复它,但我想要一个更强大的解决方案.

应用程序安装在自己的逻辑卷中,提供给ftok的路径是应用程序的二进制目录(在该lv中).提供的ID从1开始,通常有6个左右.

我已经追踪到ftok会做这样的事情:

(id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff)
Run Code Online (Sandbox Code Playgroud)

st.st_dev/st.st_ino的组合应该是非常独特的.但是我已经看过很多方框,st_dev的最低位通常是0(即st_dev数字通常是256的倍数).并且由于二进制目录位于逻辑卷中,因此无法保证inode编号与root用户不同.

有没有一个很好的方法 - 一个更好的替代ftok,或一种设置机器,使得st_dev数字将更有用于ftok?

c linux shared-memory ftok

8
推荐指数
1
解决办法
2304
查看次数

函数参数列表后的变量声明

我简单地讨论了一个C代码,其中变量似乎是在函数的参数列表之后声明的.我不知道这是可能的.

在代码中,int rint *a在参数列表之后声明arr2int.这将如何影响局部变量ararr2int

实际的原因,我想了解的代码是因为如果我让它在我的Linux的x86运行a[1] = 1//MARKERarr2intIST称为拳头时间.

但是,如果我让它在一个基于ARM的omap4开发板上运行a[1]=0,我不知道为什么会有区别.

有人可以对此发表评论吗?

long arr2int(a,r)
int r;
int *a;
{
   int i;
   long mul, result = 0, temp;

   //MARKER
   for (i=1; i<=r; i++) {
      mul = 1;
      temp = a[i]-1;
      while (temp--)
         mul = mul << 1;
      result += mul;
   }
   return(result);
}
Run Code Online (Sandbox Code Playgroud)

和调用方法:

void generateEncodingTable(){
    register int i,j;
    long temp;
    int seed = …
Run Code Online (Sandbox Code Playgroud)

c syntax declaration function

8
推荐指数
2
解决办法
2079
查看次数

如何让一个阻塞在recv()上的线程优雅地退出?

有一个线程喜欢这个:

{  
    ......    
    while (1)
    {
        recv(socket, buffer, sizeof(buffer), 0);
        ......
    }
    close(socket);           
}  
Run Code Online (Sandbox Code Playgroud)

因为线程在recv()调用时阻塞,我怎么能让线程正常退出?

c unix sockets multithreading

8
推荐指数
2
解决办法
5767
查看次数

有强大的互斥量的bug

我试图在linux上使用强大的互斥锁来保护进程之间的资源,而在某些情况下,它们似乎不会以"健壮"的方式运行.通过"健壮"的方式,我的意思是如果拥有锁的进程已经终止,pthread_mutex_lock应该返回EOWNERDEAD.

这是不起作用的场景:

2个过程p1和p2.p1创建健壮的互斥锁并等待它(在用户输入之后).p2有2个线程:线程1映射到互斥锁并获取它.线程2(在线程1获取互斥锁之后)也映射到相同的互斥锁并等待它(因为线程1现在拥有它).另请注意,在p2-thread1已经获取后,p1开始在互斥锁上等待.

现在,如果我们终止p2,p1永远不会解锁(意味着它的pthread_mutex_lock永远不会返回),这与假定的"健壮性"相反,其中p1应该用EOWNERDEAD错误解除阻塞.

这是代码:

p1.cpp:

    #include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

struct MyMtx {
    pthread_mutex_t m;
};

int main(int argc, char **argv)
{
    int r;

    pthread_mutexattr_t ma;
    pthread_mutexattr_init(&ma);
    pthread_mutexattr_setpshared(&ma, PTHREAD_PROCESS_SHARED);
    pthread_mutexattr_setrobust_np(&ma, PTHREAD_MUTEX_ROBUST_NP);

    int fd = shm_open("/test_mtx_p", O_RDWR|O_CREAT, 0666);
    ftruncate(fd, sizeof(MyMtx));

    MyMtx *m = (MyMtx *)mmap(NULL, sizeof(MyMtx),
        PROT_READ | PROT_WRITE, MAP_SHARED,fd, 0);
    //close (fd);

    pthread_mutex_init(&m->m, &ma);

    puts("Press Enter to lock mutex");
    fgetc(stdin);

    puts("locking...");
    r = pthread_mutex_lock(&m->m);
    printf("pthread_mutex_lock returned %d\n", r); …
Run Code Online (Sandbox Code Playgroud)

c++ linux mutex ipc pthreads

8
推荐指数
1
解决办法
1096
查看次数

为什么C/C++自动将char/wchar_t/short/bool/enum类型转换为int?

因此,如果我理解得很好,整体推广提供:char, wchar_t, bool, enum, short类型总是被转换为int(或unsigned int).然后,如果表达式中有不同的类型,则将应用进一步的转换.

我理解得这么好吗?

如果是,那么我的问题是:它为什么好?为什么?不要变得char/wchar_t/bool/enum/short不必要吗?我的意思是例如:

char c1;
char c2;
c1 = c2;
Run Code Online (Sandbox Code Playgroud)

正如我之前所描述的,charALWAYS被转换为int,所以在这种情况下自动转换后,这看起来像这样:

int c1;
int c2;
c1 = c2;
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么这样好,如果我知道那种char类型足以满足我的需要.

c c++ integer-promotion

8
推荐指数
2
解决办法
1700
查看次数

对send()的多次调用合并为一次调用recv()

我有一个客户端 - 服务器应用程序.

客户端使用两个不同的send()调用发送一个字符串,后跟一个整数.这两个数据应该存储在服务器上的两个不同变量中.

问题是发送的两个变量都是在recv()通话中接收的.因此,由两个不同的send()s 发送的两个字符串被链接并存储在第一个的缓冲区中recv().

server.c:

printf("Incoming connection from client %s:%i accepted\n",inet_ntoa(clientSocketAddress.sin_addr),ntohs(clientSocketAddress.sin_port));


memset(buffer,0,sizeof(buffer));
int sizeofMessage;
if ((recv(clientSocket,buffer,MAXBUFFERSIZE,0)==sizeofMessage)<0)
{
  printf("recv failed.");
  closesocket(serverSocket);
  clearWinsock();
  return EXIT_FAILURE;
}

char* Name=buffer;
printf("Name: %s\n",Name);

if ((recv(clientSocket,buffer,MAXBUFFERSIZE,0))<0)
{
  printf("bind failed.");

  closesocket(serverSocket);
  clearWinsock();
  return EXIT_FAILURE;
}

int integer=ntohs(atoi(buffer));
printf("integer: %i\n",intero);
Run Code Online (Sandbox Code Playgroud)

client.c:

if (send(clientSocket,Name,strlen(Name),0)!=strlen(Name))
{
  printf("send failed");

  closesocket(clientSocket);
  clearWinsock();
  return EXIT_FAILURE;
}

printf("client send: %s",Name);

int age=35;
itoa(htons(age),buffer,10);
sizeofBuffer=strlen(buffer);
if (send(clientSocket,buffer,sizeofBuffer,0)!=sizeofBuffer)
{
  printf("bind failed.");

  closesocket(clientSocket);
  clearWinsock();
  return EXIT_FAILURE;
} …
Run Code Online (Sandbox Code Playgroud)

c sockets tcp send recv

8
推荐指数
1
解决办法
7419
查看次数

多个文件可以存储在同一个块中吗?

我正在编写一些块级操作,我想确保我不会打击其他文件.在ext2/3/4文件系统中,多个文件可以存储在同一个块中吗?我的第一直觉是没有办法,但我想与社区核实.

c filesystems file

8
推荐指数
1
解决办法
652
查看次数

指向整数数组的指针数组

我只是想知道是否有一种方法可以使指针数组指向多维数组整数中每行的第一列.例如,请查看以下代码:

#include <stdio.h>

int day_of_year(int year, int month, int day);

main()
{
    printf("Day of year = %d\n", day_of_year(2016, 2, 1));
    return 0;
}

static int daytab[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

int day_of_year(int year, int month, int day)
{
    int leap;
    int *nlptr = &daytab[0][0];
    int *lpptr = &daytab[1][0];
    int *nlend = nlptr + month;
    int …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers turbo-c

8
推荐指数
1
解决办法
104
查看次数

pause()信号处理程序

pause()功能将阻塞,直到信号到达.假设进程得到一个信号并返回pause(),信号处理程序是否会在调用的代码之前执行pause(),或者结果是意外的?

例:

void sigusr1_handler() 
{
   // .. handler code
}

void main() 
{
   // .. bind handler to SIGUSR1

   pause(); // wait for SIGUSR1
   // some more code
}
Run Code Online (Sandbox Code Playgroud)

"更多代码"是否会 sigusr1_handler()完成执行,或者存在竞争条件?如果是这样,解决方案是什么?
除了忙碌之外我什么都想不到,但是根本不需要停顿......

c posix signals pause

8
推荐指数
1
解决办法
1471
查看次数